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

时间:2015-02-18 22:10:05

标签: python list python-2.7 count

我有一个列表,例如:

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

2 个答案:

答案 0 :(得分:4)

当你发现自己说'#34;我想要计算多少......"时,来自collections模块的Counter()很有可能帮助

在这种情况下,我们想要计算每个字母出现的列表数量。由于我们不想为每个子列表多次计算任何字母,我们会将它们转换为{{3} }:

>>> 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模块中有一个名为sets的函数可以执行相同的操作并且更容易阅读。我们想要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()会返回chain(),这意味着在我们对结果做出某些事情之前不会计算任何内容(比如列表),所以我这样做是为了展示它产生的东西。

无论如何,我们现在需要做的就是将该序列传递给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

答案 1 :(得分: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