我正在尝试遍历双重列表,但得到的结果不正确。我正在尝试获取列表中每个元素的计数。
l = [['<s>', 'a', 'a', 'b', 'b', 'c', 'c', '</s>'], ['<s>', 'a', 'c', 'b', 'c', '</s>'], ['<s>', 'b', 'c', 'c', 'a', 'b', '</s>']]
dict = {}
for words in l:
for letters in words:
dict[letters] = words.count(letters)
for x in countVocabDict:
print(x + ":" + str(countVocabDict[x]))
此刻,我得到:
<s>:1
a:1
b:2
c:2
</s>:1
它似乎只是在遍历 'l' : ['<s>', 'b', 'c', 'c', 'a', 'b', '</s>']
中的最后一个列表。
但我想得到:
<s>: 3
a: 4
b: 5
c: 6
</s>:3
在每个内部 for
循环中,您不是在 dict[letters]
的当前值中添加,而是将其设置为任何数量计入名为 word
的当前子列表(特别地)。
用普通的 dict
修复你的代码:
>>> l = [['<s>', 'a', 'a', 'b', 'b', 'c', 'c', '</s>'], ['<s>', 'a', 'c', 'b', 'c', '</s>'], ['<s>', 'b', 'c', 'c', 'a', 'b', '</s>']]
>>> d = {}
>>>
>>> for sublist in l:
...: for x in sublist:
...: d[x] = d.get(x, 0) + 1
>>> d
{'<s>': 3, 'a': 4, 'b': 5, 'c': 6, '</s>': 3}
请注意,我没有在每个内部 for
循环中调用 list.count
。调用 count
将一次又一次地遍历整个列表。每次看到一个值时只添加 1
效率要高得多,这可以通过只查看(子)列表的每个元素一次来完成。
使用计数器
。
>>> from collections import Counter
>>> Counter(x for sub in l for x in sub)
Counter({'<s>': 3, 'a': 4, 'b': 5, 'c': 6, '</s>': 3})
使用 Counter
并且不手动解除嵌套列表:
>>> from collections import Counter
>>> from itertools import chain
>>> Counter(chain.from_iterable(l))
Counter({'<s>': 3, 'a': 4, 'b': 5, 'c': 6, '</s>': 3})
我是一名优秀的程序员,十分优秀!