[英]efficienty count the elements in the list
我有一個清單:
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中的顏色來自預定義的顏色。 即假設我有一個顏色列表['red','green','teal'....],並且我想基本上找到由color和list一起出現“ n”次的紅色和綠色組成的計數。紅色和藍綠色一起出現“ m”次,依此類推。
然后..下一步是找到紅色,綠色和藍色..(一次取3次)的次數...
在python中實現此的最佳方法是什么?
您可以使用collections.Counter:
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)
假設您在子列表中出現的任何次數都表示一個“在一起”:
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
而言,這並不是很有效。
您的問題與關聯規則挖掘非常相似。 您應該查看: http : //orange.biolab.si/doc/ofb/assoc.htm 。
聽起來您實際上只是在尋找可以從任何給定列表中進行選擇的每種顏色對組合。 我可能不滿意,但是如果那是您的目標,那就是一個簡單的問題。 您只需要獲取集合中的唯一項並加總列表的長度-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))
ps set
instersection踢屁股
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.