给定一个固定列表
x = ["a", "b", "c", "d", "e"]
以及可变长度列表y1
、y2
、y3
,其具有从x
提取的可能值,例如
y1 = ["a", "b", "b"]
y2 = ["c", "e"]
y3 = ["a", "b", "d", "e", "e", "a", "b"]
是否有一种有效且可扩展的方法来分别获得y1
、y2
、y3
的输出out1
、out2
、out3
,如下所示。我的数据有很多y
,我正在努力减少循环。
out1 = [1, 1, 0, 0, 0] because a and b existed in x
out2 = [0, 0, 1, 0, 1] because c and e existed in x
out3 = [1, 1, 0, 1, 1] because a, b, d, e existed in x
执行集合转换,因此包含的检查将为O(1)
。除此之外,您将需要某种的迭代
s1, s2, s3 = map(set, (y1, y2, y3))
out1 = [int(e in s1) for e in x]
out2 = [int(e in s2) for e in x]
out3 = [int(e in s3) for e in x]
你可以选择功能更强大的:
out1 = [*map(int, map(s1.__contains__, x))]
或者,省略int
-cast(因为布尔是Python中已经存在的整数(
out1 = [*map(s1.__contains__, x)]
如果我理解这个问题,yn
中的所有元素都保证在x
中,所以您的二进制掩码会告诉您x
中哪些元素不在yn
中。
如果您没有设置为使用二进制掩码,则使用集合的可能解决方案如下
>>> a = set((1,2,3,4,5,6,7,8,9))
>>> b = set((6,7))
>>> a - b
set([1, 2, 3, 4, 5, 8, 9])
>>>
坦克你@TomKarzes的评论。