列表理解和交集问题
List comprehension and intersection problem
list(set(a[0]) & set(a[1]) & set(a[2]) & set(a[3]) & set(a[4]))
有谁知道如何以一种我们不需要先验知道我们将得到多少列表的方式来写这个? (即 5 未硬编码)?
每个 a 都是不同大小的列表。
只要你至少有一套,就可以这样做:
list(set(a[0]).intersection(*a[1:]))
如果可能没有集合,您必须自己决定 "intersection of no sets" 在您的应用程序中的实际含义。如果你想要空集:
list(set(*a[:1]).intersection(*a[1:]))
我认为值得注意的是,至少为了提高一个人的一般编程理解,你想做的事情可以描述为 映射 然后 减少 或 折叠 。具体来说,您想将 set
映射到 a
上,然后将 &
折叠到结果上。
我不是Python专家,但可以在Python中这样做:
from functools import reduce
a = [
[1,2,3],
[1,2,3,4],
[1,2,4,5],
[1,2,3,5],
]
intersection = lambda x, y: x & y
mapped = list(map(set, a))
reduced = reduce(intersection, mapped)
请注意,此实现要求 a
为非空。
list(set(a[0]) & set(a[1]) & set(a[2]) & set(a[3]) & set(a[4]))
有谁知道如何以一种我们不需要先验知道我们将得到多少列表的方式来写这个? (即 5 未硬编码)?
每个 a 都是不同大小的列表。
只要你至少有一套,就可以这样做:
list(set(a[0]).intersection(*a[1:]))
如果可能没有集合,您必须自己决定 "intersection of no sets" 在您的应用程序中的实际含义。如果你想要空集:
list(set(*a[:1]).intersection(*a[1:]))
我认为值得注意的是,至少为了提高一个人的一般编程理解,你想做的事情可以描述为 映射 然后 减少 或 折叠 。具体来说,您想将 set
映射到 a
上,然后将 &
折叠到结果上。
我不是Python专家,但可以在Python中这样做:
from functools import reduce
a = [
[1,2,3],
[1,2,3,4],
[1,2,4,5],
[1,2,3,5],
]
intersection = lambda x, y: x & y
mapped = list(map(set, a))
reduced = reduce(intersection, mapped)
请注意,此实现要求 a
为非空。