5

现在我可以计算列表中每个单词的频率。

    >>> 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}}

我将如何实现这一目标?

4

2 回答 2

13

如果您愿意接受稍微不同的格式,使用collections.Counterand很容易获得成对计数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}}
于 2013-10-23T03:53:15.680 回答
1
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}}
于 2013-10-23T04:05:52.773 回答