1

我有一个包含几列的文件,例如:

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'

我试过像:

inp = ('filename'.'r').read().strip().replace('\t',' ').split('\n')
from collections import defaultdict
D = defaultdict(line)

for line in map(str.split,inp):
     k=line[-1]
     D[k].append(line)

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

4

2 回答 2

2

发布的代码存在许多问题。列表推导中不允许使用 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方便地对重复次数求和。那让你稍微简化一下代码:

from collections import Counter
D = Counter()

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

print 'VALUE    NO TIMES REPEATED'
print '-----    -----------------'
for value, count in D.items():
    print '%-6s           %d'  % (value, count)
于 2012-05-06T05:00:51.550 回答
0

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

所以使用collections.Counter来计算每个值出现的次数,而不是defaultdict. (完全不清楚你想用 做什么defaultdict,而且你的初始化将不起作用,无论如何;defaultdict是用一个可以创建默认值的可调用构造的。在你的情况下,你显然想到的默认值是一个空列表,因此您将使用它list来初始化defaultdict。)您不需要存储行来计算它们。自动为您计算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)
于 2012-05-06T05:00:12.383 回答