2012-05-02 109 views
1

我有一個列表:efficienty計算列表中的元素

color_list = [ ['black', 'maroon', 'maroon', 'maroon', 'maroon'] 
['purple', 'black', 'maroon', 'maroon', 'maroon'] 
['maroon', 'purple', 'maroon', 'teal', 'teal'] 
['maroon', 'maroon', 'purple', 'maroon', 'maroon'] 
['teal', 'olive', 'teal', 'maroon', 'maroon'] 
    .... 
] 

現在,我要算如下:

多少次栗色和黑色多少次發生一起

紫色和黑色一起發生

栗色和紫色一起發生了多少次。

等等。 color_list中的顏色來自預定義的顏色。 即假設我有一個顏色列表['紅','綠','深青色....] ,我想基本上找到計數的紅色和綠色一起出現在「n」次的color_list一起..紅色和藍綠色一起出現「m」倍.. 等等..

然後..下一步是找到多少次紅色,綠色和藍色..(一次取3個)...

什麼是在Python中實現這個最好的方法?

+1

我認爲有4個「栗色」的列表中選擇一個「黑」(如color_list'的'第一個元素)算作「有一次,黑色和栗色發生一起」。 – flies

+0

@Lattyware:所以我嘗試了一個簡單的列表遍歷事情..維護嵌套字典和嵌套取決於我計數對的數量..所以我會有像d [「紅色」] [「綠色」]會給我一個數字..但隨後一種不同的方法來保持跟蹤3件事情......而另一種方法來跟蹤4件事情..所以我一次又一次地通過列表..這似乎不是很有效 – Fraz

+0

@ Lattyware:是在同一個列表中,兩次計爲兩個..(而不是一個) – Fraz

回答

6

您可以使用集合。計數器:

color_list = [           
['black', 'maroon', 'maroon', 'maroon', 'maroon'] , 
['purple', 'black', 'maroon', 'maroon', 'maroon'] , 
['maroon', 'purple', 'maroon', 'teal', 'teal']  , 
['maroon', 'maroon', 'purple', 'maroon', 'maroon'] , 
['teal', 'olive', 'teal', 'maroon', 'maroon']   
]              

from collections import Counter 

cnt = [Counter(x) for x in color_list] 

for x, y in [('black', 'maroon'), ('teal', 'olive')]: 
    print x, y, sum(min(c[x], c[y]) for c in cnt) 
+0

+1 - 這是更好的解決方案,您需要兩對來計算兩次出現。 –

+0

請注意,計數器是在2.7版本中引入的 – fabrizioM

3

。假定你把任何出現的次數在一個子表是指一個「合」:

color_sets = [set(sublist) for sublist in color_list] 
looking_for = {"maroon", "black"} 
sum(looking_for <= sublist for sublist in sublist) 

這是通過使您的名單成組,那麼如果looking_for檢查是集合的子集,總結結果(如True計爲1作爲整數)。

編輯:

剛剛看到您的評論說你希望出現的次數無關緊要。如果是這樣的話,那麼我有簡單的適應是:

sum(min(sublist.count(item) for item in looking_for) for sublist in color_list) 

然而,隨着list.count()使用了這麼多,這不會成爲大looking_for的甚efficent。

+0

我不是Python專家,但你確定'['黑','黑','褐紅色','褐紅色','褐紅色']'不會算作你的算法中的六個重合? – flies

+0

@flies我不這麼認爲,你爲什麼認爲它會呢? –

+0

因爲我幾乎不能讀取蟒蛇。你是對的。 :X – flies

1

這聽起來像是你真的只是在尋找可以從任何給定列表製作的每種顏色對組合。我可能會離開,但如果這是你的目標,那是一個簡單的問題。您只需要獲取集合中的唯一項目並累計列表的長度 - 1.這是尋找訂單不重要的配對的標準解決方案。如果你從最左邊的元素開始,比如列表4,索引爲0.它的右邊有3個項目可以與它配對。移至索引1,我們已經對索引0進行了計數,因此右邊有2個項目可與之配對,依此類推。最簡單的方法在Python做,這是剛剛

sum(xrange(0, len(set(colors))-1)) 

如果你有需要你隨心所欲列表中找到對特定的顏色,這是同樣簡單:

sum(xrange(0, len(set(colors) & set(chosen_colors))-1)) 

附: set ins k踢屁股

+0

,因爲'['黑','黑','褐紅色','褐紅色','褐紅色']'被視爲兩個黑色/褐色對,目標不僅僅是找到每個組合,而是要權衡組合你以特定的方式找到。 – flies

+0

@飛得很公平,當我寫答案的時候並不清楚。我的第一個幾句是我對當時問題的解釋。 – Endophage