【问题标题】:counting element occurrences in nested lists计算嵌套列表中的元素出现次数
【发布时间】:2012-08-03 11:47:40
【问题描述】:

这可能是一个非常简单的问题,但我在其他地方找不到答案,所以我会问。 查找元素在嵌套列表中出现的次数的最佳方法是什么? 例如:

my_list=[[a,b,c,d],[a,b,z,d],[a,c,f,e],[d,w,f,a]]

我如何找到“a”是列表的第一个元素的次数?或者更一般地说,“a”在 my_list 中出现了多少次?我想有一种方法可以使用 collections.Counter 来做到这一点,但我一直无法弄清楚。

编辑 对于 my_list,我希望在计算它是否是列表的第一个元素时输出 a:3。如果更改问题以查看 b 是否是第二个元素,则所需的输出将是 b:2

【问题讨论】:

  • Nested List and count()的可能重复
  • 不是故意复制!我也对从列表中的特定位置(即第一个元素)计数更感兴趣,而不仅仅是一般在列表中
  • 在这种情况下,您的问题不是很清楚。如果您提供示例,您还应该提供预期的输出。此外,我链接的问题肯定包含足够的建议,您可能会自己提出解决方案。这对于 Python-tag 来说是非常有症状的。关于如何使用 [嵌套] 列表执行 x? 有很多非常相似的问题 - 答案可能已经存在。
  • 请理解,我不想阻止您提出问题 - 我想鼓励您在做之前做更多的研究。如果您找到的材料不能完全解决您的问题,请在您的问题中链接到该材料,以便其他人可以看到您到目前为止所拥有的内容。
  • 感谢您的反馈,以后我会尽量让我的问题更清楚:) 如果我能找到我以前看过的问题,我会在中添加一些链接>

标签: python list counter


【解决方案1】:

使用嵌套的生成器表达式:

Counter(x for sublist in my_list for x in sublist)

要计算第一个位置的项目,不同的生成器表达式会获取该项目以进行计数:

Counter(sublist[0] for sublist in my_list)

演示:

>>> from collections import Counter
>>> my_list=[['a','b','c','d'],['a','b','z','d'],['a','c','f','e'],['d','w','f','a']]
>>> Counter(x for sublist in my_list for x in sublist)
Counter({'a': 4, 'd': 3, 'c': 2, 'b': 2, 'f': 2, 'e': 1, 'w': 1, 'z': 1})
>>> Counter(sublist[0] for sublist in my_list)
Counter({'a': 3, 'd': 1})

【讨论】:

    【解决方案2】:
    from collections import Counter
    from itertools import chain
    
    counts = Counter(chain.from_iterable(my_list))
    

    或生成一个新列表并使用计数:

    new_list = list(chain.from_iterable(my_list))
    print new_list.count(whatever)
    

    如果你想要多少次 'a' 是第一个,那么类似:

    sum(1 for el in my_list if el[0] is a) # or == a if object identity is not required
    

    【讨论】:

    • 有没有办法在不自己输入的情况下生成计数的内容?例如,my_list[item][2] 会计算第二个位置的所有内容吗?
    • Counterchain 在这种情况下比@MartijnPieters 的方法快。
    • @Snaaa [2] 指的是 0 个索引数组中的第 3 项。
    • 啊,当然,愚蠢的错误。是否可以使用这种安排?
    • @Snaaa 我发布了那个安排。
    【解决方案3】:
    >>> from collections import defaultdict, Counter
    >>> my_list = [['a', 'b', 'c', 'd'], ['a', 'b', 'z', 'd'], ['a', 'c', 'f', 'e'], ['d', 'w', 'f', 'a']]
    >>> pos_count = defaultdict(Counter)
    >>> for sublist in my_list:
            for i, c in enumerate(sublist):
                pos_count[c][i] += 1
    
    
    >>> pos_count['a'][0]
    3
    >>> pos_count['b'][1]
    2
    

    【讨论】:

    • 这有很多开销,有没有一种程序方法可以有效地做到这一点?仅在用户/代码请求完成时才完成工作?
    • @InbarRose 开销真的有问题吗?我在考虑增长,一旦初始化,这对于频繁/多次访问会更有效。在这种情况下采用 MartijnPieters 的方法,尽管我仍然不确定这是否真的是一个问题:D
    猜你喜欢
    • 2020-06-09
    • 2011-08-10
    • 1970-01-01
    • 2020-02-08
    • 2013-09-11
    • 2016-05-28
    • 2018-11-20
    • 1970-01-01
    相关资源
    最近更新 更多