2012-05-02 31 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