Форум сайта python.su
36
from collections import Counter
from itertools import groupby
from operator import itemgetter
DATA = """
Количество CPU = 1, frequency = 2.6 GHz
Количество CPU = 1, frequency = 2.7 GHz
Количество CPU = 1, frequency = 2.7 GHz
Количество CPU = 1, frequency = 2.8 GHz
Количество CPU = 2, frequency = 1.0 GHz
Количество CPU = 2, frequency = 1.0 GHz
Количество CPU = 2, frequency = 1.0 GHz
Количество CPU = 2, frequency = 1.0 GHz
Количество CPU = 2, frequency = 1.0 GHz
Количество CPU = 2, frequency = 1.0 GHz
""".strip()
if "__main__" == __name__:
for cpu, freq in ((k, list(g)) for k, g in \
groupby(sorted(
l.split(",") for l in DATA.split("\n")),
key=itemgetter(0))):
print("{} = {} шт.".format(cpu.replace("=", ":"), len(freq)))
for k, v in Counter(x[1] for x in freq).items():
print("\t{} = {}".format(k.strip(), v))
Офлайн
0
Спасибо, правда вот до смешного не могу перебороть ошибку:
for ln in TEST.split('\n'):
AttributeError: ‘list’ object has no attribute ‘split’
—-
возникает когда пытаюсь читать текст из файла. ..
к примеру так -
f = open ('c:\statistika1.txt')
TEST = f.readlines()
f.close()
—-
Если переводить в “str”,как требует сплит, напрмиер так test = str(TEST) - то полученный результат не верный..
—-
второй вариант сегодня посмотрю.. =) спасибо.
Отредактировано (Дек. 9, 2011 06:58:49)
Офлайн
0
Чтото я совсем запутался) Можно вас попросить прокоментировать Ваши коды…
Офлайн
25
если у вас уже список то .split() не нужен - я привел пример для блока строк а не для списка.
Офлайн
0
В процессе изучения ваших кодов =) разбираюсь.
Офлайн
0
s0rgВопрос почему когда список выглядит так :
Я под шаманил под себя ваш код, получилось следующееf = open(r'c:\stat11.txt')
data = []
cpu_stat = dict()
for line in f:
line = "%s \n" %(line.strip (' \n'))
data.append(line)
f.close()
for ln in data:
words = ln.split(' ')
cpu = words[3].strip(',')
freq = words[6]
cpu_dict = cpu_stat.setdefault(cpu, {})
cpu_dict[freq] = cpu_dict.get(freq, 0) + 1
n=[]
z = []
for k,v in cpu_stat.iteritems():
z=[] #тут решил сделать так, как пока умею...
pk = 'CPU Num: %s \n' % k
n.append(pk)
for k1,v1 in v.iteritems():
pv = 'Freq: %s count: %d \n' % (k1, v1)
z.append(pv)
z.sort()
n.extend(z)
fout = open(r'c:\stat22.txt', 'a')
for ms in n:
fout.write(ms)
fout.close()
Офлайн
25
Словарь это НЕ сортированная последовательность, то что у вас сначала шел ‘CPU Num: 1’ а потом ‘CPU Num: 2’ это просто совпадение )
Если нужно получить отсортированный словарь то нужно делать так:
for k in sorted(cpu_stat.iterkeys()):
z=[] #тут решил сделать так, как пока умею...
pk = 'CPU Num: %s \n' % k
n.append(pk)
for k1,v1 in cpu_stat[k].iteritems():
pv = 'Freq: %s count: %d \n' % (k1, v1)
z.append(pv)
z.sort()
n.extend(z)
line = "%s \n" %(line.strip (' \n'))Офлайн
0
s0rg—
Еще не понятем мне сакральный смысл этой строки:line = "%s \n" %(line.strip (' \n'))
Отредактировано (Дек. 12, 2011 12:47:42)
Офлайн
36
hram.py а почему Вы упорно не хотите воспользоваться решениями, которые предлагает сам Python? Вас пугают множественные импорты?
from collections import Counter
from itertools import groupby
from operator import itemgetter
with open(r"c:\stat11.txt", "r") as fin, open(r"c:\stat22.txt", "a") as fout:
pairs = ((x[3][:-1], x[6]) for x in (line.split() for line in fin))
for cpu_num, freq in ((k, Counter(x[1] for x in g)) for k, g in \
groupby(sorted(pairs), key=itemgetter(0))):
print("CPU num: {} count: {}".format(cpu_num, sum(freq.values())), file=fout)
for f, n in sorted(freq.items()):
print("\tFreq: {} count: {}".format(f, n), file=fout)
CPU num: 1 count: 3
Freq: 1.0 count: 1
Freq: 2.7 count: 1
Freq: 2.8 count: 1
CPU num: 2 count: 11
Freq: 2.0 count: 1
Freq: 2.2 count: 1
Freq: 2.6 count: 2
Freq: 3.1 count: 3
Freq: 3.2 count: 2
Freq: 3.3 count: 1
Freq: 3.5 count: 1
CPU num: 3 count: 5
Freq: 3.0 count: 5
Офлайн
0
Скажем так - на первый взгляд да пугают. Да и просто сроки поджимали, с первым вариантом легче было разобраться вот и применил его. А сейчас уже кошусь в сторону второго и думаю. на недельке разберу его и применю уже. )
Предложеный вами вариант мне очень нравится) Я в давние времена С++ занимался, а потом долгие годы вапще не было практики.. И сейчас когда приходится на python'е работать, не могу поверить “наверно” что можно вот так вот все это писать и делать =) Да и сроки .. А вот теперь да работа сдана, можно довести ее до ума разобраться получше. И сделать добротный инструмент. Спасибо, кстати вам обоим за помощ!
Отредактировано (Дек. 13, 2011 09:43:08)
Офлайн