我想交叉两个嵌套列表:
source = [['one', 'two', 'three'], ['four', 'five', 'six'], ['seven', 'eight', 'nine']]
target = [['three', 'whatever'], ['four', 'whatever'], ['whatever', 'whatever']]
所以我可以在找到交叉点的source
中返回列表:
result = [['one', 'two', 'three'], ['four', 'five', 'six']]
如何使用lambda
?
答案 0 :(得分:5)
您可以使用 set 检查元素之间是否有任何交集:
[s for s in source if any(set(s) & set(t) for t in target)]
# [['one', 'two', 'three'], ['four', 'five', 'six']]
如果事先将目标转换为集合列表,这可能会稍微提高效率:
target_set = [set(t) for t in target]
[s for s in source if any(set(s) & t for t in target_set)]
说lambda
时,您可能需要filter
功能:
filter(lambda s: any(set(s) & t for t in target_set), source)
或者在python 3中:
list(filter(lambda s: any(set(s) & t for t in target_set), source))
似乎你的逻辑与@JohnColeman评论的相同:
target_set = {j for i in target for j in i}
filter(lambda s: set(s) & target_set, source)
# [['one', 'two', 'three'], ['four', 'five', 'six']]
答案 1 :(得分:2)
您只需使用[object Object]
中的set.difference
并结合过滤器:
ionic lib update
这将保留包含任何lambda
列表中至少一个项目的任何列表。
或者,如果您不喜欢list(filter(lambda s: set(s).difference(*target) != set(s),
source))
,您可以明确地进行检查:
target