【问题标题】:Count the number of lists containing specific element in a nested list计算嵌套列表中包含特定元素的列表数
【发布时间】:2015-04-20 02:54:55
【问题描述】:

我有一个清单,例如:

res = [['a', 'b', 'a'], ['a', 'b', 'c'], ['a']]

我想计算有多少列表包含一个特定的字母。例如,“a”包含在 3 个列表中,“b”包含在 2 个列表中,“c”包含在 1 个列表中。

下面的代码是我目前所拥有的:

count=0
docs='a'

list1=[]

for c in range(len(res)):
    for i in res[0]:
        list1.append(i)
        for i in list1:
            if i == docs:
                count=1
print count

【问题讨论】:

    标签: python list python-2.7 count


    【解决方案1】:

    当您发现自己在说“我想数数……”时,Counter()(来自 collections 模块)很有可能会提供帮助。

    在这种情况下,我们想计算每个字母出现在多少个列表中。由于我们不想为每个子列表多次计算任何字母,我们将它们转换为sets

    >>> res = [['a', 'b', 'a'], ['a', 'b', 'c'], ['a']]
    >>> [set(x) for x in res]
    [{'b', 'a'}, {'c', 'b', 'a'}, {'a'}]
    

    顺序会混淆,但这没关系,只要每个列表中只有一个字母即可。

    现在我们想将这些字母组合成一个序列,这样我们就可以将它们全部计数。我们可以这样做:

    >>> [s for x in res for s in set(x)]
    ['b', 'a', 'c', 'b', 'a', 'a']
    

    ...但这有点难以理解。幸运的是,itertools 模块中有一个名为chain() 的函数可以做同样的事情并且更容易阅读。我们想要chain.from_iterable() 版本:

    >>> from itertools import chain
    >>> c = chain.from_iterable(set(x) for x in res)
    >>> list(c)
    ['b', 'a', 'c', 'b', 'a', 'a']
    

    不要太担心list(c) - chain() 返回一个iterator,这意味着在我们对结果进行实际操作(比如将其放入列表)之前,什么都不会计算,所以我这样做了显示它产生了什么。

    无论如何,我们现在需要做的就是将该序列传递给Counter()

    >>> from collections import Counter
    >>> Counter(chain.from_iterable(set(x) for x in res))
    Counter({'a': 3, 'b': 2, 'c': 1})
    

    这就是全部内容:

    from collections import Counter
    from itertools import chain
    
    res = [['a', 'b', 'a'], ['a', 'b', 'c'], ['a']]
    
    letter_count = Counter(chain.from_iterable(set(x) for x in res))
    
    print(letter_count['a'])  # prints 3
    

    【讨论】:

    • 不客气 :-) 如果您愿意,可以accept my 或 Mark Tolonen 的回答,让未来的读者知道它解决了您的问题。
    • 我没有足够的声誉来选择答案。我最近加入了stackoverflow
    • 你还不能投票,但你可以接受(投票上/下按钮下的复选标记)。我在之前的评论中包含的link 解释了更多...
    • (顺便说一句,我不是要强求,只是提供信息 :-) 当然,您应该只接受您真正认为可以解决您的问题的答案)
    • 不,你不是咄咄逼人,因为我是新手,很高兴知道。谢谢你。
    【解决方案2】:

    一个简单的列表推导就可以解决问题。

    >>> L=[['a', 'b', 'a'], ['a', 'b', 'c'], ['a']]
    >>> ['a' in x for x in L]
    [True, True, True]
    >>> ['b' in x for x in L]
    [True, True, False]
    

    利用True被认为是1的知识:

    >>> sum('a' in x for x in L)
    3
    >>> sum('b' in x for x in L)
    2
    >>> sum('c' in x for x in L)
    1
    

    【讨论】:

    • 我试过这种方式,它说 Typeerror: 'int' object is not callable。我是 python 新手,所以很难预测行为。
    • @sjain Mark 的回答对我有用——你确定你输入正确吗?
    • 它向我展示了上面提到的 sum('a' in x for x in L) 我以同样的方式做到了
    • 啊,那你肯定已经创建了一个名为sum的变量。如果您退出 Python 并重新开始(注意不要创建 sum 变量),您应该会发现它可以工作。
    • @sjain this question 可能会帮助您了解那里发生的事情...
    猜你喜欢
    • 2013-09-11
    • 2018-07-25
    • 1970-01-01
    • 2020-01-10
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 2018-10-13
    相关资源
    最近更新 更多