如何计算列表中对的频率?

use*_*628 4 python python-2.7

现在我能够计算列表中每个单词的频率.

    >>> list =['a', 'b', 'a', 'c', 'a', 'c']

frequency = {}
for w in words:
    frequency[w] = frequency.get(w, 0) + 1
return frequency
Run Code Online (Sandbox Code Playgroud)

它给了我这个输出:

{'a':3,'b':1,'c:2'}

但我想给它的是每个列表项的对频率.例如,'b'在'a'1次之后,'c'在'a'之后2次.

{ '一个':{ 'B':1, 'C':2}, 'B':{ 'A':1}, 'C':{ 'A':1}}

我将如何实现这一目标?

DSM*_*DSM 12

如果您愿意接受稍微不同的格式,则很容易使用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})
Run Code Online (Sandbox Code Playgroud)

如果你真的想要你给出的格式,你有几个选择,但是有一种方法可以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}}
Run Code Online (Sandbox Code Playgroud)