删除重复项后显示计数

时间:2012-02-10 23:15:35

标签: python duplicates

不确定我是否应该为此分解数据库,但看到此问题的另一种解决方案会很有趣。

我在文本文件中有一些文本行,如...

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

2 个答案:

答案 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"))。