Python AND运算符使用2个以上的列表

时间:2014-07-14 20:41:23

标签: python list

我有一个关于多个列表比较的问题。我有一个"主列表"和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语句中匹配的颜色保持不变,以便它们对于每个都是相同的。有时候子列表中的项目会匹配,有时候他们会赢。

3 个答案:

答案 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的subsetsuperset功能完成此操作。

更新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}}(但由于您只搜索单个值,我不知道为什么你将)。这基本上是bitmaptruth 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将包含每个组合的值数。