计算列表中值的重复次数并生成输出

2024-10-06 12:11:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件,有几个列,如:

PAIR 1MFK 1 URANIUM 82 HELIUM 112 2.5506  
PAIR 2JGH 2 PLUTONIUM 98 POTASSIUM 88 5.3003  
PAIR 345G 3 SODIUM 23 CARBON 14 1.664  
PAIR 4IG5 4 LITHIUM 82 ARGON 99 2.5506  
PAIR 234G 5 URANIUM 99 KRYPTON 89 1.664  

现在我要做的是读取最后一列并迭代重复的值并生成一个包含两列'VALUE' & 'NO OF TIMES REPEATED'的输出文件。在

我试过:

^{pr2}$

我被困在这里了。
请帮忙。!在


Tags: 文件ofnovaluecarbontimesuraniumpair
2条回答

Now what I wanted to do is read the last column and iterate the values for repetitions and generate an output file containing two column 'VALUE' & 'NO OF TIMES REPEATED'.

所以使用collections.Counter来计算每个值出现的次数,而不是defaultdict。(根本不清楚您要用defaultdict做什么,而且您的初始化也不会起作用;defaultdict是用一个将创建默认值的可调用函数构造的。在您的例子中,您显然想到的默认值是一个空列表,因此您将使用list来初始化{}),您不需要存储行来计数它们。Counter会自动为您计数。在

另外,提前处理整个文件有点难看,因为您可以直接遍历文件并获取行,这将为您完成部分处理。虽然您实际上可以在Counter创建中自动执行该迭代。在

这里有一个完整的解决方案:

from collections import Counter
with open('input', 'r') as data:
    histogram = Counter(line.split('\t')[-1].strip() for line in data)
with open('output', 'w') as result:
    for item in histogram.iteritems():
        result.write('%s\t%s\n' % item)

发布的代码有许多问题。列表理解中不允许使用while循环。defaultdict的参数应该是list而不是line。以下是代码的修复版本:

from collections import defaultdict
D = defaultdict(list)

for line in open('filename', 'r'):
    k = line.split()[-1]
    D[k].append(line)

print 'VALUE    NO TIMES REPEATED'
print '  -            -'
for value, lines in D.items():
    print '%-6s           %d'  % (value, len(lines))

另一种方法是使用collections.Counter方便地求出重复次数的总和。这样可以简化代码:

^{pr2}$

相关问题 更多 >