【问题标题】:Counting appearance of an element in many lists计算一个元素在许多列表中的出现次数
【发布时间】:2014-08-13 21:21:27
【问题描述】:

我有几个列表:

l1 = [1,2,3,4,5,6,7,8]
l2 = [1,3,5,7]
l3 = [4,5,1,8,2]
l4 = [1,2,6,7]
l5 = [5,7,8]

我想计算每个元素的出现次数,所以输出应该是

element 1 appears in 3 lists
element 2 in 3
element 3 in 2
element 4 in 2
element 5 in 4
...

我可以使用任何内置函数或聪明的想法来做到这一点吗?因为我可以使用循环来做到这一点,但这似乎是一个非常具有破坏性的想法。

【问题讨论】:

  • 那么您的“破坏性”基于循环的实现在哪里你的聪明的想法是什么?你读过你提到的built-in functions吗?事实上,您自己有没有任何努力?
  • @jonrsharpe:OP 说“他可以使用循环来做到这一点”,但选择不这样做。他正在寻求一种方法。虽然这似乎是一个与缺乏经验有关的问题,但它也是一种想象。不是每个人的装备都相似。

标签: python list python-2.7 python-3.x


【解决方案1】:

我会将collections.Counteritertools.chain 结合起来:

>>> all_lists = [l1, l2, l3, l4, l5]
>>> from itertools import chain
>>> from collections import Counter
>>> all_counts = Counter(chain.from_iterable(all_lists))
>>> for k, v in all_counts.items():
...     print('element', k, 'appears in', v, 'lists')
...     
element 1 appears in 4 lists
element 2 appears in 3 lists
element 3 appears in 2 lists
element 4 appears in 2 lists
element 5 appears in 4 lists
element 6 appears in 2 lists
element 7 appears in 4 lists
element 8 appears in 3 lists

(如果你想保证输出顺序是升序的,你可能想在那里扔一个sorted。)

如果@jonrsharpe 是正确的,并且您需要处理一个元素可以在单个列表中多次出现的情况(现在它实际上是“元素 1 出现 4”,而不是 4列表),你可以在那里扔一个set

all_counts = Counter(chain.from_iterable(map(set, all_lists)))

所以无论一个元素在列表中出现多少次,它只计为 1。

【讨论】:

  • 很酷的想法(+1) :) 这是我没想到的好方法
  • 这可能会给出错误的答案,例如1 在同一个列表中出现两次,具体取决于 OP 需要什么输出
  • @DSM 感谢您的回答!我可以从这个例子中学到很多新东西。在我的问题中,当同一个元素在一个列表中多次出现时,我不需要进行场景,但是我这个例子对于我想要创建的其他功能也非常好。
【解决方案2】:
numbers = set(l1+l2+l3+l4+l5)
for n in numbers:
    print "%d in %d lists"%(n,sum(n in l for l in [l1,l2,l3,l4,l5]) )

【讨论】:

    【解决方案3】:

    我会使用 defaultdict 只检查一次列表 -

    counter = defaultdict(int)
    for list_ in [l1, l2, l3, l4, l5]:
        for value in list_:
            counter[value] += 1
    for key in sorted(counter.keys()):
        print('Value {} appears in {} lists'.format(key, counter[key]))
    

    这给出了以下输出 -

    Value 1 appears in 4 lists
    Value 2 appears in 3 lists
    Value 3 appears in 2 lists
    Value 4 appears in 2 lists
    Value 5 appears in 4 lists
    Value 6 appears in 2 lists
    Value 7 appears in 4 lists
    Value 8 appears in 3 lists
    

    【讨论】:

    • 这与下面 DSM 的答案完全相同......但是 +1 因为这两者的整体复杂性都比我的要好
    • 我认为帝斯曼的回答比我的要酷得多。 :) 我以前没有和collections.Counter 合作过。
    猜你喜欢
    • 1970-01-01
    • 2021-07-25
    • 2018-11-20
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多