2013-04-15 72 views
14

我對python相當陌生,但是我一直無法在任何地方找到解決方案。計算元組列表中的出現次數

我想計算一個元組列表中字符串的出現次數。

這裏是元組的列表:

list1 = [ 
     ('12392', 'some string', 'some other string'), 
     ('12392', 'some new string', 'some other string'), 
     ('7862', None, 'some other string') 
     ] 

我已經試過,但由於相同的ID時,它只是打印0

for entry in list1: 
    print list1.count(entry[0]) 

兩次在列表中,這應該返回:

2 
1 

我也嘗試增加每個相同ID的發生計數器,但不能完全掌握如何wri它。編輯: 使用Eumiro真棒的答案。我只是意識到我沒有解釋整個問題。 我真的需要它有一個值大於1項的總金額但如果我嘗試這樣做:

for name, value in list1: 

    if value > 1: 
     print value 

我得到這個錯誤:

ValueError: Too many values to unpack 

回答

24

也許collections.Counter可以解決你的問題:

from collections import Counter 
Counter(elem[0] for elem in list1) 

回報

Counter({'12392': 2, '7862': 1}) 

這樣做很快,因爲它只是遍歷列表一次。您遍歷條目,然後嘗試在列表中獲得這些條目的計數。不能用.count做,但可能會做如下:

for entry in list1: 
    print sum(1 for elem in list1 if elem[0] == entry[0]) 

但嚴重的是,看看collections.Counter

編輯我真的需要它有一個值項的總金額超過1

,您仍然可以使用Counter

c = Counter(elem[0] for elem in list1) 
sum(v for k, v in c.iteritems() if v > 1) 

回報2,即總和的計數大於1.

+0

'Counter'使它變得如此簡單 – jamylak

+0

謝謝!這真的很簡單!我只是意識到我沒有解釋整個問題。我更新了原來的問題。 – mackwerk

+0

@Mackwerk - 看到我編輯的答案。 – eumiro

4

list1.count(entry[0])將不起作用,因爲它看起來每個thr例如list1中的元組。例如('12392', 'some string', 'some other string'),並檢查它們是否等於'12392',這顯然不是這種情況。

@ eurmiro的答案告訴你如何用Counter(這是最好的方法!),但這裏是一個窮人的版本來說明如何Counter作品使用字典和dict.get(k, [,d])方法,將嘗試一鍵搞定(k),但如果它不存在,則返回默認值,而不是(d):

>>> list1 = [ 
     ('12392', 'some string', 'some other string'), 
     ('12392', 'some new string', 'some other string'), 
     ('7862', None, 'some other string') 
] 
>>> d = {} 
>>> for x, y, z in list1: 
     d[x] = d.get(x, 0) + 1 


>>> d 
{'12392': 2, '7862': 1} 
+0

酷!相當有趣,看看它是如何工作的:) – mackwerk