【问题标题】:Show tally after removing duplicates删除重复项后显示计数
【发布时间】:2012-02-10 23:15:35
【问题描述】:

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

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

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)

有没有任何一种 python 魔法可以做到这一点? 提前致谢。

编辑: 酷,我研究了收藏并想出了,

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

【问题讨论】:

  • 阅读collections.defaultdict。然后重写你的问题,包括defaultdict上的任何问题。

标签: python duplicates


【解决方案1】:

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"))

【讨论】:

    【解决方案2】:

    当您考虑在 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"))。

    【讨论】:

      猜你喜欢
      • 2017-07-27
      • 1970-01-01
      • 2019-07-07
      • 2021-12-25
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多