我有一个关于多个列表比较的问题。我有一个"主列表"和5个子列表。 5个子列表中的某些项目是相同的,并非所有项目都与主列表中的项目相匹配。我知道每个中都有哪些,但主列表很大。这可能有点令人困惑,但我需要确定这些子列表中的重叠,以在networkx中标记不同的颜色。
我的代码现在:(并且它不起作用)
master = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
s1 = [ 1, 2, 3]
s2 = [1, 3, 4]
s3 = [1, 2, 6]
s4 = [2, 3, 4]
colors = []
for m in masterlist:
if m in s1 and m in s2 and m in s3:
colors.append('magenta')
elif m in s1 and m in s3 and m in s4:
colors.append('blue')
elif m in s1 and m in s2 and m in s4:
colors.append('green')
elif m in s1 and m in s3:
colors.append('cyan')
elif m in s2 and m in s4:
colors.append('tan')
elif m in s1:
colors.append('aquamarine')
elif m in s2:
colors.append('gold')
elif m in s3:
colors.append('yellow')
elif m in s4:
colors.append('black')
else:
colors.append('gray')
print colors
期望的输出:
['gray', 'magenta', 'blue', 'green', 'tan', 'gray', 'yellow', 'gray', 'gray', 'gray', 'gray']
我注意到它不起作用的点是带有两个AND语句的行。有谁知道我应该如何改变这个?我应该使用像' contains'?
我还需要通过颜色知道重叠发生的位置。所以我一直在使用颜色列表的计数方法:
print "s1-2-3 overlaps:", colors.count('magenta')
print "s1-3-4 overlaps:", colors.count('blue')
print "s1-2-4 overlaps:", colors.count('green')
print "s1 unique:", colors.count('aquamarine')
...
基于上面示例我需要的输出是带有颜色字符串的列表。如果主列表中的项目包含在所有5个子列表中,我需要一个颜色名称与主列表在颜色列表中的位置相同。然后,对于子列表中的所有剩余项目,我需要为每个项目的颜色列表添加不同的颜色,主列表中的所有其他项目与任何子列表都不匹配,颜色为相同的颜色。同样,这是针对networkx图。所以颜色将对应于节点。
我将做30多次制作许多图表,所以我需要elif语句中匹配的颜色保持不变,以便它们对于每个都是相同的。有时候子列表中的项目会匹配,有时候他们会赢。
答案 0 :(得分:2)
根据您评论中的信息,我认为您所追求的是:
master = {'A', 'B', 'C', 'D', 'E'}
s1 = {'A', 'B', 'E'}
s2 = {'B', 'D', 'E'}
s3 = {'E', 'A', 'C'}
>>> master.intersection(s1, s2, s3)
{'E'}
>>> master.intersection(s1)
{'A', 'B', 'E'}
>>> master.intersection(s1, s2)
{'B', 'E'}
等等。您应该能够非常轻松地推导出如何从中追加交叉点。
除非您正在寻找特定重叠,否则I.E.子列表。在这种情况下,@ stark的答案可能更有用,但您也可以使用set的subset
或superset
功能完成此操作。
更新1
使用超集的示例(显然不是广泛的集合,但应该让你朝着正确的方向前进):
masters = [{'A', 'B', 'C'},{'A', 'C'}, {'B', 'C'}, {'A', 'B', 'C', 'E'}]
s1 = {'A', 'E'}
s2 = {'B', 'C'}
s3 = {'A', 'C', 'E'}
colors = []
for mlist in masters:
if mlist.issuperset(s1) and mlist.issuperset(s2) and mlist.issuperset(s3):
colors.append('magenta')
elif mlist.issuperset(s1) and mlist.issuperset(s3):
colors.append('blue')
elif mlist.issuperset(s2) and mlist.issuperset(s3):
colors.append('green')
elif mlist.issuperset(s1):
colors.append('green')
elif mlist.issuperset(s2):
colors.append('gold')
elif mlist.issuperset(s3):
colors.append('yellow')
else:
colors.append('grey')
>>> colors
['gold', 'grey', 'gold', 'magenta']
更新2
根据您的进一步解释,我认为这就是您所寻找的:
master = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
s1 = { 1, 2, 3}
s2 = {1, 3, 4}
s3 = {1, 2, 6}
s4 = {2, 3, 4}
# A color key is (in_s1, in_s2, in_s3, in_s4)
color_map = {(True, True, True, False) :'magenta',
(True, False, True, True) :'blue',
(True, True, False, True) :'green',
(True, False, True, False) :'cyan',
(False, True, False, True) :'tan',
(True, False, False, False):'aquamarine',
(False, True, False, False):'gold',
(False, False, True, False):'yellow',
(False, False, False, True):'black',
(False, False, False, False):'grey'}
def color_key(element):
return element in s1, element in s2, element in s3, element in s4
def color_list(in_list):
return [color_map[color_key(element)] for element in in_list]
>>> color_list(master)
['grey', 'magenta', 'blue', 'green', 'tan', 'grey', 'yellow', 'grey', 'grey', 'grey', 'grey']
如果您愿意,可以进一步枚举排列(它们有2^num_s
)以获得更多颜色。请注意,sN
的速度为sets
,但如果您需要重复值,则lists
可能为{{1}}(但由于您只搜索单个值,我不知道为什么你将)。这基本上是bitmap或truth table方法,但扩展为更明确一些方法。
答案 1 :(得分:1)
最简单的,可迭代的"意味着它支持for和while循环所使用的机制:
for x in foo: # foo is an iterable
...
如果您愿意,可以使自己的对象可迭代;这允许您在for或while循环中使用它们,作为map()等方法的参数或许多其他地方。更多信息https://docs.python.org/2/library/stdtypes.html
答案 2 :(得分:0)
也许使用查找表
colorlist = ('gray', 'aquamarine', 'gold', 'gold', black' ...etc.
bitmap = 0
if m in s1:
bitmap += 1
if m in s2:
bitmap += 2
if m in s3:
bitmap += 4
colors.append(colorlist[bitmap])
count[bitmap]++
使用5种变量的所有32种颜色填写查找表。 count将包含每个组合的值数。