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

时间:2013-10-23 03:40:19

标签: 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

它给了我这个输出:

  

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

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

  

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

我将如何完成这项工作?

2 个答案:

答案 0 :(得分:10)

如果您愿意接受略有不同的格式,则可以使用collections.Counterzip轻松获得成对计数:

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