我想获取嵌套列表中所有元素的数量。
nested_lst = [[('NOUN', 'shoe'), ('NOUN', 'shirt'), ('NOUN', 'jacket')], [('VERB', 'jump')], [('NOUN', 'shoe'), ('NOUN', 'shirt'), ('ADJ', 'fancy')]]
我的预期结果是:
{'NOUN': 5, 'shoe': 2, 'shirt':2, 'VERB': 1, 'jump': 1, 'jacket': 1, 'ADJ': 1, 'fancy':1}
我当前的代码:Counter(itertools.chain(*nested_lst))
产生了元组的数量,而不是每个元素的数量。
答案 0 :(得分:1)
应用链两次以消除内部元组
from itertools import chain
from collections import Counter
Counter(chain(*chain(*nested_lst)))
或
Counter(chain.from_iterable(chain.from_iterable(nested_lst)))
输出:
Counter({'ADJ': 1,
'NOUN': 5,
'VERB': 1,
'fancy': 1,
'jacket': 1,
'jump': 1,
'shirt': 2,
'shoe': 2})
答案 1 :(得分:1)
您非常亲密。您只需要通过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})
答案 2 :(得分:0)
In [2]: for i in nested_lst:
...: for j in i:
...: for k in j:
...: d[k] = d.setdefault(k, 0) + 1
...:
In [3]: d
Out[3]:
{'ADJ': 1,
'NOUN': 5,
'VERB': 1,
'fancy': 1,
'jacket': 1,
'jump': 1,
'shirt': 2,
'shoe': 2}
答案 3 :(得分:0)
如果您的列表仅嵌套一次,则可以使用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)
答案 4 :(得分:0)
您始终可以遍历每个元组列表,并使用Counter.update()
添加计数:
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})