2013-10-23 38 views
2

現在我可以計算列表中每個單詞的頻率。如何統計列表中對的頻率?

>>> 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次。

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

我該如何去做到這一點?

回答

9

如果你願意接受一個稍微不同的格式,可以很容易地得到使用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}} 
+0

如果有什麼是列表的列表,例如[[ '一', 'B', 'A', 'C', 'A', 'C'],[ '一',」 f']]我想遍歷兩個列表來獲得{'a':{'c':2,'b':1,'f':1},'c':{'a':1} ,'b':{'a':1}}? – user2909628

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