计算嵌套列表中包含特定元素的列表的数量

sja*_*ain 0 python list count python-2.7

我有一个清单,例如:

res = [['a', 'b', 'a'], ['a', 'b', 'c'], ['a']]
Run Code Online (Sandbox Code Playgroud)

我想计算有多少个列表包含特定字母。例如,“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
Run Code Online (Sandbox Code Playgroud)

Zer*_*eus 5

Counter()当您发现自己说“我想数一下有多少……”时,该模块很有可能collections可以提供帮助。

在本例中,我们想要计算每个字母出现在多少个列表中。由于我们不想对每个子列表多次计算任何字母,因此我们将它们转换为集合

>>> res = [['a', 'b', 'a'], ['a', 'b', 'c'], ['a']]
>>> [set(x) for x in res]
[{'b', 'a'}, {'c', 'b', 'a'}, {'a'}]
Run Code Online (Sandbox Code Playgroud)

顺序会混淆,但这并不重要,只要每个列表中只有一个字母即可。

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

>>> [s for x in res for s in set(x)]
['b', 'a', 'c', 'b', 'a', 'a']
Run Code Online (Sandbox Code Playgroud)

...但这有点难以理解。幸运的是,模块中有一个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']
Run Code Online (Sandbox Code Playgroud)

不要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})
Run Code Online (Sandbox Code Playgroud)

整个事情是这样的:

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
Run Code Online (Sandbox Code Playgroud)