计算嵌套列表中包含特定元素的列表数
Count the number of lists containing specific element in a nested list
我有一个列表,例如:
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
当您发现自己在说 "I want to count how many ..." 时,很有可能 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()
returns 和 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
一个简单的列表理解就可以解决问题。
>>> 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
我有一个列表,例如:
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
当您发现自己在说 "I want to count how many ..." 时,很有可能 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()
returns 和 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
一个简单的列表理解就可以解决问题。
>>> 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