匹配固定列表和可变长度列表,并基于固定列表返回二进制掩码



给定一个固定列表

x = ["a", "b", "c", "d", "e"]

以及可变长度列表y1y2y3,其具有从x提取的可能值,例如

y1 = ["a", "b", "b"]
y2 = ["c", "e"]
y3 = ["a", "b", "d", "e", "e", "a", "b"]

是否有一种有效且可扩展的方法来分别获得y1y2y3的输出out1out2out3,如下所示。我的数据有很多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的评论。

最新更新