Python 对嵌套列表中的所有元组元素进行计数

Python 对嵌套列表中的所有元组元素进行计数,python,list,count,tuples,Python,List,Count,Tuples,我想获得嵌套列表中所有元素的计数。 nested_lst=[('noon','shoe'),('noon','shirt'),('noon','jacket'),[('VERB','jump'),[('noon','shoe'),('noon','shirt'),('ADJ','fancy')] 我的预期结果是: {'NOUN': 5, 'shoe': 2, 'shirt':2, 'VERB': 1, 'jump': 1, 'jacket': 1, 'ADJ': 1, 'fancy':1} 我

我想获得嵌套列表中所有元素的计数。
nested_lst=[('noon','shoe'),('noon','shirt'),('noon','jacket'),[('VERB','jump'),[('noon','shoe'),('noon','shirt'),('ADJ','fancy')]

我的预期结果是:

{'NOUN': 5, 'shoe': 2, 'shirt':2, 'VERB': 1, 'jump': 1, 'jacket': 1, 'ADJ': 1, 'fancy':1}

我的当前代码:
计数器(itertools.chain(*nested_lst))
,它生成元组计数而不是每个元素

应用链两次以去除内部元组

from itertools import chain
from collections import Counter
Counter(chain(*chain(*nested_lst)))

输出:

Counter({'ADJ': 1,
         'NOUN': 5,
         'VERB': 1,
         'fancy': 1,
         'jacket': 1,
         'jump': 1,
         'shirt': 2,
         'shoe': 2})

你很接近。您只需通过
chain
返回的值进行另一次迭代即可获得所需的输出:

from collections import Counter
from itertools import chain

nested_lst = [[('NOUN', 'shoe'), ('NOUN', 'shirt'), ('NOUN', 'jacket')], [('VERB', 'jump')], [('NOUN', 'shoe'), ('NOUN', 'shirt'), ('ADJ', 'fancy')]]

print(Counter(y for x in chain.from_iterable(nested_lst) for y in x))
# Counter({'NOUN': 5, 'shoe': 2, 'shirt': 2, 'jacket': 1, 'VERB': 1, 'jump': 1, 'ADJ': 1, 'fancy': 1})

如果您的列表只嵌套一次,则可以使用
sum()
获得一个平面列表。 在此之后,您可以创建一个空字典,并在单词出现的每个迭代中增加值。如果有一个新词,则默认值为零,并且将添加一个新词。但很可能不是最有效的解决方案

nested_lst = [[('NOUN', 'shoe'), ('NOUN', 'shirt'), ('NOUN', 'jacket')], [('VERB', 'jump')], [('NOUN', 'shoe'), ('NOUN', 'shirt'), ('ADJ', 'fancy')]]
flat_lst = sum(nested_lst, [])
dct = {}
for typ, name in flat_lst:
    dct[typ] = 1 + dct.setdefault(typ, 0)
    dct[name] = 1 + dct.setdefault(name, 0)

# {'NOUN': 5, 'shoe': 2, 'shirt':2, 'VERB': 1, 'jump': 1, 'jacket': 1, 'ADJ': 1, 'fancy':1}
print(dct)

您始终可以单步遍历每个元组列表,并使用以下命令添加计数:


用户似乎是新手,不要忘记包含导入语句
from collections import Counter
from itertools import chain

nested_lst = [[('NOUN', 'shoe'), ('NOUN', 'shirt'), ('NOUN', 'jacket')], [('VERB', 'jump')], [('NOUN', 'shoe'), ('NOUN', 'shirt'), ('ADJ', 'fancy')]]

print(Counter(y for x in chain.from_iterable(nested_lst) for y in x))
# Counter({'NOUN': 5, 'shoe': 2, 'shirt': 2, 'jacket': 1, 'VERB': 1, 'jump': 1, 'ADJ': 1, 'fancy': 1})
nested_lst = [[('NOUN', 'shoe'), ('NOUN', 'shirt'), ('NOUN', 'jacket')], [('VERB', 'jump')], [('NOUN', 'shoe'), ('NOUN', 'shirt'), ('ADJ', 'fancy')]]
flat_lst = sum(nested_lst, [])
dct = {}
for typ, name in flat_lst:
    dct[typ] = 1 + dct.setdefault(typ, 0)
    dct[name] = 1 + dct.setdefault(name, 0)

# {'NOUN': 5, 'shoe': 2, 'shirt':2, 'VERB': 1, 'jump': 1, 'jacket': 1, 'ADJ': 1, 'fancy':1}
print(dct)
from collections import Counter
from itertools import chain

nested_lst = [[('NOUN', 'shoe'), ('NOUN', 'shirt'), ('NOUN', 'jacket')], [('VERB', 'jump')], [('NOUN', 'shoe'), ('NOUN', 'shirt'), ('ADJ', 'fancy')]]

counts = Counter()
for lst in nested_lst:
    counts.update(Counter(chain.from_iterable(lst)))

print(counts)
# Counter({'NOUN': 5, 'shoe': 2, 'shirt': 2, 'jacket': 1, 'VERB': 1, 'jump': 1, 'ADJ': 1, 'fancy': 1})