使用lambda函数相交嵌套列表

时间:2017-03-04 02:25:17

标签: python list lambda

我想交叉两个嵌套列表:

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

执行此操作

2 个答案:

答案 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