现在我可以计算列表中每个单词的频率。
>>> list =['a', 'b', 'a', 'c', 'a', 'c']
frequency = {}
for w in words:
frequency[w] = frequency.get(w, 0) + 1
return frequency
它给了我这个输出:
{'a':3,'b':1,'c:2'}
但我想给它的是每个列表项的对频率。例如,'b'在'a'1次之后,'c'在'a'之后2次。
{ 'A':{ 'B':1, 'C':2}, 'B':{ 'A':1}, 'C':{ 'A':1}}
我将如何完成这项工作?
答案 0 :(得分:10)
如果您愿意接受略有不同的格式,则可以使用collections.Counter
和zip
轻松获得成对计数:
>>> seq = list("abacac")
>>> from collections import Counter
>>> c = Counter(zip(seq, seq[1:]))
>>> c
Counter({('a', 'c'): 2, ('b', 'a'): 1, ('c', 'a'): 1, ('a', 'b'): 1})
如果你真的想要你给出的格式,你有几个选择,但有一种方法是使用itertools.groupby
来收集所有以相同元素开头的对:
>>> from itertools import groupby
>>> grouped = groupby(sorted(zip(seq, seq[1:])), lambda x: x[0])
>>> {k: dict(Counter(x[1] for x in g)) for k,g in grouped}
{'a': {'c': 2, 'b': 1}, 'c': {'a': 1}, 'b': {'a': 1}}
答案 1 :(得分:0)
mylist = ['a', 'b', 'a', 'c', 'a', 'c']
freq = {}
for idx, char in enumerate(mylist):
if idx == len(mylist) - 1: break
if char not in freq: freq.setdefault(char, {})
if mylist[idx + 1] in freq[char]:
freq[char][mylist[idx + 1]] += 1
else:
freq[char].setdefault(mylist[idx + 1], 1)
print freq
<强>输出强>
{'a': {'c': 2, 'b': 1}, 'c': {'a': 1}, 'b': {'a': 1}}