2017-03-04 108 views
2

相交嵌套列表,我想相交两个嵌套表:使用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

+0

,你到底是什么意思?你的意思是子列表中的一个项目应该在另一个子列表的一个项目中?或者它应该在“相同的”子列表(相同的索引)? – MSeifert

+0

@MSeifert是的,子列表中的一项应该与另一个子列表中的项目相同。 –

回答

5

您可以使用设置来检查是否有元素之间任何交集:

[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

“如果事先将目标转换为设置列表,这可能会稍微更有效率” - 为什么不通过组合将其转换为单个集合呢? –

+0

@JohnColeman啊,我认为你是对的,逻辑似乎是这样的。 – Psidom

+0

'target_set = reduce(lambda s,b:s | b,[set(t)for t in target],set())'然后'[s for s in source if set(s)&target_set] – galfisher

2

你可以简单地在lambda中使用set.difference结合过滤器:

list(filter(lambda s: set(s).difference(*target) != set(s), 
      source)) 

这将保留包含至少一个项目在任何target列表中的任何列表。

或者,如果你不喜欢set是你可以做的检查明确:

list(filter(lambda s: any(item in sublist for sublist in target for item in s), 
      source)) 
当你说相交