2016-11-15 71 views
0

的名單我有一個列表:頻率元組

a = [(['7', '8'], ['4', '7'],['3', '4'],['3', '8'],['4', '8'],...............['3','4'])] 

我想創建2列這給我在列表中的元組的頻率。例如:

bigram  frequency 
['7','8']  2 
['4','7']  3 
['3', '4'] 6 

等等。

此外,考慮條目像['7','8']['8','7']相同(重複)。唯一的一個條目應該在列中並且頻率應該被添加到該列中。

我試圖用

from collections import counter 

,並做一些循環過它,但我得到的錯誤是:

unhashable類型:列表

+0

嘗試:在'計數器(元組(i)用於I A [ 0])'因爲你有一個帶有第一個元組元組的列表,其中存在需要被轉換爲元組的列表 –

+0

@ Mr.A耶,工作正常,謝謝,請你看看我編輯過的對問題 – Shubham

+0

@Mr。 A考慮條目如 ['7','8']和['8','7'] 相同(重複)。並且唯一一個條目應該在列中並且頻率應該被添加到該列中。 – Shubham

回答

1

嘗試:

from collections import Counter 

a = [(['7', '8'], ['4', '7'],['3', '4'],['3', '8'],['4', '8'],['3','4'],['7','8'],['8','7'],['4','3'])] 

frequency_list = Counter(tuple(sorted(i)) for i in a[0]) 

print "bigram","frequency" 
for key,val in frequency_list.items(): 
    print key, val 

輸出如下

bigram frequency 
('4', '7') 1 
('4', '8') 1 
('7', '8') 3 
('3', '4') 3 
('3', '8') 1 
+0

先生,它會刪除我的副本嗎?例如[7,8]和[8,7]是相同的,並從列表中刪除[8,7],但頻率添加[7,8] – Shubham

+0

是的,這將刪除重複 –

+0

謝謝先生,它只是一部分我的代碼,如果你能幫我解決這個問題,這將是非常有用的 [點擊鏈接](http://stackoverflow.com/questions/40594210/create-a-bigram-from-a-column- in-pandas-df) – Shubham

3

名單不是可哈希要用作字典鍵,您需要將它們轉換爲可哈希對象。在這種情況下tuple是一個合適的選擇:

In [5]: Counter(map(tuple, a[0])).items() 
Out[5]: 
[(('4', '7'), 1), 
(('4', '8'), 1), 
(('7', '8'), 1), 
(('3', '4'), 2), 
(('3', '8'), 1)] 

如果你要考慮unordere數組你有相同的對它們進行排序它們將它們傳遞到Counter

In [7]: a 
Out[7]: 
[(['7', '8'], 
    ['4', '7'], 
    ['3', '4'], 
    ['3', '8'], 
    ['4', '8'], 
    ['3', '4'], 
    ['7', '4'])] 

In [8]: Counter(tuple(sorted(i)) for i in a[0]) 
Out[8]: Counter({('4', '7'): 2, ('3', '4'): 2, ('3', '8'): 1, ('7', '8'): 1, ('4', '8'): 1}) 

注意,由於你的數字是字符串,如果他們有一個以上的數字長度,你應該在排序前將它們轉換爲整數,否則它們會按照字典順序排序。 a = [('7', '8'), ... ('4', '7')]

或者您可以將列表映射到元組,因爲元組是可哈希而不是名單:

+0

考慮類似於 ['7','8']和['8','7'] 相同(重複)。並且唯一一個條目應該在列中並且頻率應該被添加到該列中。 – Shubham

+0

感謝先生,這只是我的代碼的一部分,如果你能幫我解決這個問題,這將是非常有用的 [點擊鏈接](http://stackoverflow.com/questions/40594210/create-一個bigram-from-a-column-in-pandas-df) – Shubham

+0

可能沒必要首先將它們轉換爲整數,因爲'sorted'函數是一致的,無關緊要我們對'['3'只有在保證一致性的前提下,'1','2']到'['1','2','3']或'['1','3','2']' ,最終輸出中不存在重複項。 – Jason

2

,如果你改變你的列表,將工作中使用計數器。

[更新]對每個列表進行排序然後將每個列表映射到元組。 Counter(map(lambda x: tuple(sorted(x)), a[0])).items()(基於@Kasramvd)。

+0

考慮類似於 ['7','8']和['8','7'] 相同(重複)。並且唯一一個條目應該在列中並且頻率應該被添加到該列中。 – Shubham

+0

查看更新。 @SRingne – Jason

+0

先生,它會刪除重複的條目,如我所說的? – Shubham

0

我想你可以使用itertools.groupby來分組項目的排序列表。組的關鍵可以是可以創建有序列表的自定義鍵。對於二進制元組,你可以使用一個簡單的比較來建立這樣一個元組

考慮

a = [(['7', '8'], ['4', '7'],['3', '4'],['3', '8'],['4', '8'],['4','3'])] 


from itertools import groupby 
key = lambda tup: tup if tup[0] < tup[1] else tup[::-1] 
[(key, len(list(values))) 
for key, values in groupby(sorted(a[0], key = key), key = key)] 
Out[42]: 
[(['3', '4'], 2), 
(['3', '8'], 1), 
(['4', '7'], 1), 
(['4', '8'], 1), 
(['7', '8'], 1)] 

如果在列表中兩個以上的項目,可以考慮使用分類爲關鍵。這可能不是有效的,但可以方便

[(key, len(list(values))) 
for key, values in groupby(sorted(a[0], key = sorted), key = sorted)] 
Out[37]: 
[(['3', '4'], 2), 
(['3', '8'], 1), 
(['4', '7'], 1), 
(['4', '8'], 1), 
(['7', '8'], 1)] 
+0

先生,它會刪除我的副本嗎?例如[7,8]和[8,7]是相同的,並從列表中刪除[8,7],但在[7,8]中添加頻率 – Shubham

+0

@SRingne:是的。看我上面的例子 – Abhijit

+0

謝謝,先生,這只是我的代碼的一部分,如果你能幫我解決這個問題,這將是非常有用的 [點擊鏈接](http://stackoverflow.com/questions/ 40594210 /創建一個bigram-from-a-column-in-pandas-df) – Shubham