1

我有一个清单:

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 中实现这个的最好方法是什么?

4

4 回答 4

6

您可以使用 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)
于 2012-05-02T18:08:27.480 回答
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)

但是,由于使用了这么多,这对于较大的 slist.count()不会很有效。looking_for

于 2012-05-02T17:53:36.947 回答
1

您的问题与Association Rule Mining非常相似。你应该看看: http: //orange.biolab.si/doc/ofb/assoc.htm

于 2012-05-02T17:54:37.633 回答
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))

ps setintersection 踢屁股

于 2012-05-02T18:04:15.717 回答