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

使用2个以上列表的Python和运算符,python,list,Python,List,我有一个关于比较多个列表的问题。我有一个“主列表”和5个子列表。5个子列表中的某些项是相同的,并且并非所有项都与主列表中的项匹配。我知道每一个都有哪些,但是主列表很大。这可能有点混乱,但我需要识别这些子列表中的重叠,以便在networkx中标记不同的颜色 我现在的代码:(但它不工作) 期望输出: ['gray', 'magenta', 'blue', 'green', 'tan', 'gray', 'yellow', 'gray', 'gray', 'gray', 'gray'] 我注意到它不

我有一个关于比较多个列表的问题。我有一个“主列表”和5个子列表。5个子列表中的某些项是相同的,并且并非所有项都与主列表中的项匹配。我知道每一个都有哪些,但是主列表很大。这可能有点混乱,但我需要识别这些子列表中的重叠,以便在networkx中标记不同的颜色

我现在的代码:(但它不工作)

期望输出:

['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语句中匹配的颜色保持不变,以便每个语句的颜色相同。有时子列表中的项会匹配,有时则不匹配

可以使用查找表代替

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将有每个组合的值数。

根据您评论中的信息,我认为您所追求的是这样的东西:

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'}
等等。您应该能够非常容易地从中导出如何附加交点

除非您正在查找特定的重叠,即子列表。在这种情况下,@stark的答案可能更有用,但是您也可以使用set的
子集
超集
功能来实现这一点

更新1

使用超集的示例(显然不是扩展集,但应该让您朝着正确的方向前进):

更新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\u
)以获得更多颜色。请注意,
sN
是速度的
集合,但是如果您需要重复的值,则可以是
列表
(尽管由于您只搜索单个值,我不知道为什么要这样做)。这基本上是or方法,尽管对其进行了扩展,使其更加明确。

最简单地说,“iterable”意味着它支持for和while循环使用的机器:

for x in foo:  # foo is an iterable
  ...

如果你愿意,你可以让你自己的物品变得宜人;这允许您在for或while循环中使用它们,作为map()等方法的参数或在许多其他地方使用它们。更多信息

您能否详细说明列表中的值类型?串?整数?等等?随机建议:由于您不断测试s1中的
m
等,可能会对它们进行一次评估,将它们分配给变量(
m1=m,s1
),然后只测试这些布尔值。可能无法解决问题,但它会加快您的代码速度。我还强烈建议您考虑使用此方法,特别是
交叉
方法。当然,假设你没有/不在乎重复。它们是氨基酸序列的字符串。你可以简单地链交叉点。交叉点(c)
将为您提供
a
b
c
中的元素。或者你可以将多个迭代器传递到交集,以获得相同的效果。斯塔克,你能再详细说明一下吗?颜色必须是字符串才能传递到networkx。我会将颜色中的int值替换为颜色名称吗?我还需要知道他们来自的原始列表。请参阅对原始问题的编辑并更新答案。您也可以使用
操作符而不是
issuperset
方法:
如果mlist>s1和mlist>s2和mlist>s3
。好的,我认为您的代码可以工作。非常感谢。你为什么用{}呢?它们不是为字典保留的吗?@user3358205
{value}
也可以用来初始化
集合
文本,尽管不是空的
集合(
{}
始终是空的
dict
)。我收到一个错误消息:“AttributeError:'str'对象没有属性'issuperset'如果“master”是列表格式(由[]包围),而“s”列表也是列表格式,这有关系吗?我没有像你的答案那样把它分解。@user3358205是的,它是。
issupertt
方法是
集合
的成员,而不是
列表
。您必须在检查时将它们转换为
set
。但是请注意,
集合
是无序的,显然不允许重复。如果订单很重要,或者您有重复的订单,那么
set
不是您的工具。
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']
for x in foo:  # foo is an iterable
  ...