2012-08-06 67 views
3

這可能是一個相當直接的問題,但我無法在別處找到答案,所以我會問。 找到元素出現在嵌套列表中的次數的最佳方法是什麼? 例如:計數嵌套列表中的元素出現

my_list=[[a,b,c,d],[a,b,z,d],[a,c,f,e],[d,w,f,a]] 

我怎麼會找到多少次「一」是列表的第一個元素?或者更一般地說,my_list中出現了多少次「a」?我想有一種方法可以用collections.Counter來做到這一點,但我一直沒有弄明白。

編輯 對於my_list,我會計算如果是列表的第一個元素時喜歡a:3輸出。如果問題變爲看是否b爲第二元件,期望的輸出將是b:2

+0

可能重複[嵌套列表和count()](http://stackoverflow.com/questions/5828123/nested-list-and-count) – 2012-08-06 13:44:16

+0

不是故意重複!我更喜歡從列表中的特定位置(即第一個元素)開始計數,而不僅僅是列表中的一般信息 – Snaaa 2012-08-06 13:50:59

+1

在這種情況下,您的問題不是很清楚。如果你提供一個例子,你也應該提供預期的輸出。另外,我所鏈接的問題當然包含足夠的建議,您可能會自己想出一個解決方案。這是Python標籤的特徵。有很多關於*如何用[嵌套]列表做x的非常類似的問題?* - 答案可能已經存在。 – 2012-08-06 13:57:20

回答

7

使用嵌套發生器表達式:

Counter(x for sublist in my_list for x in sublist) 

要計算在所述第一位置中的項目,不同的生成器表達式獲取項目計數:

Counter(sublist[0] for sublist in my_list) 

演示:

>>> from collections import Counter 
>>> my_list=[['a','b','c','d'],['a','b','z','d'],['a','c','f','e'],['d','w','f','a']] 
>>> Counter(x for sublist in my_list for x in sublist) 
Counter({'a': 4, 'd': 3, 'c': 2, 'b': 2, 'f': 2, 'e': 1, 'w': 1, 'z': 1}) 
>>> Counter(sublist[0] for sublist in my_list) 
Counter({'a': 3, 'd': 1}) 
3
from collections import Counter 
from itertools import chain 

counts = Counter(chain.from_iterable(my_list)) 

或產生新的列表,並使用計數:

new_list = list(chain.from_iterable(my_list)) 
print new_list.count(whatever) 

如果你想多少次「一」是第一,然後是這樣的:的

sum(1 for el in my_list if el[0] is a) # or == a if object identity is not required 
+0

中添加一些鏈接是否有一種方法可以生成計數沒有自己輸入?例如,my_list [item] [2]會計算第二個位置的所有內容嗎? – Snaaa 2012-08-06 13:45:30

+0

在這種情況下,帶有'chain'的'Counter'比@MartijnPieters的方法快。 – jamylak 2012-08-06 13:47:56

+0

@Snaaa'[2]'是指0索引數組中的第3項。 – jamylak 2012-08-06 13:54:57

1
>>> from collections import defaultdict, Counter 
>>> my_list = [['a', 'b', 'c', 'd'], ['a', 'b', 'z', 'd'], ['a', 'c', 'f', 'e'], ['d', 'w', 'f', 'a']] 
>>> pos_count = defaultdict(Counter) 
>>> for sublist in my_list: 
     for i, c in enumerate(sublist): 
      pos_count[c][i] += 1 


>>> pos_count['a'][0] 
3 
>>> pos_count['b'][1] 
2 
+0

這裏有很多開銷,有沒有一種程序化的方式來有效地做到這一點?工作只在用戶/代碼要求完成時完成? – 2012-08-06 14:07:50

+1

@InbarRose開銷真的是個問題嗎?我正在考慮增長,對於頻繁/多次訪問初始化後,這將更有效。儘管我還不確定這是否是一個問題:D – jamylak 2012-08-06 14:11:57