【问题标题】:Counting the amount of occurrences in a list of tuples计算元组列表中出现的次数
【发布时间】:2013-04-07 11:13:01
【问题描述】:

我对 python 还很陌生,但我无法在任何地方找到解决问题的方法。

我想计算一个字符串在元组列表中出现的次数。

这里是元组列表:

list1 = [
         ('12392', 'some string', 'some other string'),
         ('12392', 'some new string', 'some other string'),
         ('7862', None, 'some other string')
        ]

我试过了,但它只打印 0

for entry in list1:
    print list1.count(entry[0])

由于相同的 ID 在列表中出现两次,这应该返回:

2
1

我还尝试为每次出现相同的 ID 增加一个计数器,但无法完全掌握如何编写它。

*编辑: 使用 Eumiro 的绝妙答案。我才意识到我没有解释整个问题。 我实际上需要值大于 1 的条目总数。但如果我尝试这样做:

for name, value in list1:

    if value > 1:
        print value

我收到此错误:

ValueError: Too many values to unpack

【问题讨论】:

    标签: python list tuples counting


    【解决方案1】:

    也许collections.Counter 可以解决你的问题:

    from collections import Counter
    Counter(elem[0] for elem in list1)
    

    返回

    Counter({'12392': 2, '7862': 1})
    

    它很快,因为它只遍历您的列表一次。您迭代条目,然后尝试在列表中获取这些条目的计数。 .count 无法做到这一点,但可以通过以下方式完成:

    for entry in list1:
        print(sum(1 for elem in list1 if elem[0] == entry[0]))
    

    但是说真的,看看collections.Counter

    编辑我实际上需要值大于 1 的条目总数。

    您仍然可以使用Counter

    c = Counter(elem[0] for elem in list1)
    sum(v for k, v in c.iteritems() if v > 1)
    

    返回2,即大于1的计数总和。

    【讨论】:

    • Counter 让一切变得如此简单
    • 谢谢!这真的很简单!我才意识到我没有解释整个问题。我更新了原来的问题。
    • @eumiro - 太棒了!非常感谢!总而言之,你正在做的事情叫做理解,对吧?
    • @Mackwerk - 准确地说是一个生成器理解
    • @eumiro - 酷。感谢您的帮助:)
    【解决方案2】:

    list1.count(entry[0]) 将不起作用,因为它会查看list1 中的三个元组中的每一个,例如。 ('12392', 'some string', 'some other string') 并检查它们是否等于 '12392',例如,显然不是这样。

    @eurmiro 的回答向您展示了如何使用 Counter(这是最好的方法!)但这里有一个穷人的版本来说明 Counter 如何使用字典和 dict.get(k, [,d]) 方法将尝试获取密钥 (k),但如果它不存在,则返回默认值 (d):

    >>> list1 = [
             ('12392', 'some string', 'some other string'),
             ('12392', 'some new string', 'some other string'),
             ('7862', None, 'some other string')
    ]
    >>> d = {}
    >>> for x, y, z in list1:
            d[x] = d.get(x, 0) + 1
    
    
    >>> d
    {'12392': 2, '7862': 1}
    

    【讨论】:

      【解决方案3】:

      我需要一些 Counter 没有的额外功能。我有一个元组列表,第一个元素是键,第二个元素是要添加的数量。 @jamylak 解决方案非常适合这个!

      >>> list = [(0,5), (3,2), (2,1), (0,2), (3,4)]
      
      >>> d = {}
      >>> for x, y in list1:
          d[x] = d.get(x, 0) + y
      
      >>> d
      {0: 7, 2: 1, 3: 6}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-09
        • 1970-01-01
        • 2011-08-10
        • 2018-05-11
        • 2018-11-20
        相关资源
        最近更新 更多