我有一个清单:
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中的颜色来自预定义的颜色。 即假设我有一个颜色列表['红色','绿色','青色'.... 我想基本上找到红色和绿色一起在color_list中“n”次出现的计数。红色和青色一起出现“m”次。 等等..
然后..下一步是找到红色,绿色和蓝色的次数..(一次取3个)......
在python中实现它的最佳方法是什么?
答案 0 :(得分: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)
答案 1 :(得分: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
作为整数)。< / p>
刚刚看到你的评论说你确实希望事件的数量很重要。如果是这样的话,那么简单地改编我所拥有的是:
sum(min(sublist.count(item) for item in looking_for) for sublist in color_list)
但是,由于使用list.count()
这么多,对于较大的looking_for
来说这不会非常有效。
答案 2 :(得分:1)
您的问题与Association Rule Mining非常相似。你应该看看:http://orange.biolab.si/doc/ofb/assoc.htm。
答案 3 :(得分:1)
听起来你真的只是在寻找可以从任何给定列表中制作的每个颜色对组合。我可能会离开,但如果这是你的目标,这是一个简单的问题。您只需要获取集合中的唯一项目并总结列表的长度 - 1.这是查找订单不重要的对的标准解决方案。如果你从最左边的元素开始说一个列表4,索引0.它右边有3个项目可以与它配对。移动到索引1,我们已经计算了索引为0的对,因此右边有两个项目可以配对,依此类推。在Python中执行此操作的简单方法就是
sum(xrange(0, len(set(colors))-1))
如果您有特定的颜色,您需要在任意列表中找到对,它同样简单:
sum(xrange(0, len(set(colors) & set(chosen_colors))-1))
P.S。 set
instersection踢屁股