Python:用另一个列表过滤列表列表

Posted

技术标签:

【中文标题】Python:用另一个列表过滤列表列表【英文标题】:Python: filter list of list with another list 【发布时间】:2013-08-29 04:46:40 【问题描述】:

我正在尝试过滤列表,我想从列表 A(是列表的列表)中提取与键索引 0 匹配的元素,另一个列表 B 具有一系列值

喜欢这个

list_a = list(
  list(1, ...),
  list(5, ...),
  list(8, ...),
  list(14, ...)
)

list_b = list(5, 8)

return filter(lambda list_a: list_a[0] in list_b, list_a)

应该返回:

list(
    list(5, ...),
    list(8, ...)
)

我该怎么做?谢谢!

【问题讨论】:

如果我修复列表的构造函数,您的解决方案对我有用。 (提示:使用[5,8] 而不是list(5,8) 【参考方案1】:

使用列表推导:

result = [x for x in list_a if x[0] in list_b]

为了提高性能,请先将list_b 转换为集合。

正如@kevin 在 cmets 中指出的那样,list(5,8)(除非它不是伪代码)是无效的,你会得到一个错误。

list() 只接受一个项目并且该项目应该是可迭代的/迭代器

【讨论】:

更通用的方法是将两个列表相交。 @rjurney 如果你的意思是使用集合,那么取决于,你想失去秩序还是保留它?并感谢有用的反对票。【参考方案2】:

其实你们很亲近。只需这样做:

list_a = list(
  list(1, ...),
  list(5, ...),
  list(8, ...),
  list(14, ...)
)

# Fix the syntax here
list_b = [5, 8]

return filter(lambda list_a: list_a[0] in list_b, list_a)

【讨论】:

您关于预先创建函数的评论是错误的:filter(lambda list_a: ..., list_a) 会做同样的事情,因为 lambda 语句在传递给 filter 之前被评估为函数值。 @Dougal - 谢谢。我这样做是因为,不久前,有人对我说它每次都重新创建了lambda。我认为这听起来不对,但假设他比我知道的更多,因此接受了他的建议。显示您因不仔细检查信息而得到的结果...

以上是关于Python:用另一个列表过滤列表列表的主要内容,如果未能解决你的问题,请参考以下文章

重新排列后用另一个列表中的数字替换一个列表

在 Python 中,如何用另一个列表索引一个列表?

C++ 用另一个向量扩展一个向量

Python 根据另一个列表中不存在的值过滤一个列表

python根据键值过滤字典列表

python字典列表过滤器