不确定我是否应该为此分解数据库,但看到此问题的另一种解决方案会很有趣。
我在文本文件中有一些文本行,如...
Bill
Bill
Pete
Mary
Mary
Mary
我不想复制并实现它......
f = open('cgi/log/ipAddressList.log', 'r')
uniquelines = set(f.read().split("\n"))
for line in uniquelines:
print line
f.close()
这给了我......
Bill
Mary
Pete
但是现在我想说明它们在文本文件中出现了多少个实例,如...
Bill (2)
Mary (3)
Pete (1)
有没有任何一种蟒蛇魔法可以做到这一点? 提前谢谢。
编辑: 很酷,我查看了收藏品并提出了,
f = open('cgi/log/ipAddressList.log', 'r')
c = collections.Counter( f.read().split("\n") )
uniquelines = set(c)
for line in uniquelines:
print line + '%s (%d)' % (line, c[line])
f.close()
刚刚注意到关于readlines()的新评论,所以也要感谢。
这是我的词典解决方案......
f = open('cgi/log/ipAddressList.log', 'r')
l = list( f.readlines() )
d = {}
for i in set(l):
d[i] = l.count(i)
print d
答案 0 :(得分:3)
collections.Counter
可能会做你正在寻找的东西。
示例:
>>> from collections import Counter
>>> lst = ['Bill', 'Bill', 'Pete', 'Mary', 'Pete']
>>> c = Counter(lst)
>>> c
Counter({'Pete': 2, 'Bill': 2, 'Mary': 1})
>>> for k,v in c.items():
... print(k,v)
...
Pete 2
Bill 2
Mary 1
您可以将其应用于您的案例:
Counter(f.read().split("\n"))
答案 1 :(得分:0)
当你考虑用Python计算时,你(几乎)总是应该考虑字典。这是一个可能的解决方案:
people = {}
for person in f:
people[person] = people.get(person, 0) + 1
for person in people:
print '%s (%d)' % person
可能你不会在这里需要这个,但最好使用f.readlines()
而不是自己进行分割(f.read().split("\n")
)。