【问题标题】:filter list of list by matching with lists in other list regardless of their position通过与其他列表中的列表匹配来过滤列表列表,而不管它们的位置如何
【发布时间】:2020-11-13 07:01:45
【问题描述】:

我有 2 个列表,我想根据与 list2 中的元素匹配来过滤 list1:

list1 = [[1,2,3], [4,5,16]]
list2 = [[9,8,50], [7,10,3]]

每个列表中的最后一个元素是唯一的 id(例如 list[0][-1] 是唯一的) 我想从 list1 (list) 中获取在 list2 中的元素中具有相同最后一个元素的元素

在我的例子中

list1[0][-1] is similar to list2[1][-1]

我试试这个:

[x for x, y in zip(list1, list2) if x[-1] == y[-1]]

但它按位置过滤(检查两个列表中具有相同位置的元素) 无论他们的位置如何,我都想检查他们

编辑 预期结果:

[1,2,3] from the list 1 (because hit last element (list[-1]) is the same as  last element in a list inside list2)

【问题讨论】:

  • 为什么不向我们展示预期的结果?
  • 完成,我添加了它

标签: python


【解决方案1】:

您可以使用set 首先存储来自list2 的所有ID,然后使用列表解析过滤list1,如下所示:

list2_ids = {x[-1] for x in list2}
result = [x for x in list1 if x[-1] in list2_ids]

【讨论】:

  • 当他说“ids”时,我以为他指的是对象的“id”,但根据你的回答,我才意识到他指的是最后一个元素
  • 我的意思是唯一 ID(在 list1 内的其他列表中找不到)
  • @Adam.Er8 我可以通过创建新列表来再次过滤结果,其中两个列表中的匹配元素具有相同的第一个元素?因为当我得到结果时,匹配的列表在其他位置可能会有所不同
【解决方案2】:
list1 = [[1,2,3], [4,5,16]]
list2 = [[9,8,50], [7,10,3]]

lst = [x for x in list1 if x[-1] in set([y[-1] for y in list2])]
#Out[3]: [[1, 2, 3]]

【讨论】:

  • 因此,对于list1 中的每个元素,您(重新)计算来自list2 的id 列表,最重要的是,甚至每次都将其变成一个集合。似乎相当低效且毫无意义。
猜你喜欢
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 2017-06-14
  • 2023-02-12
  • 2022-01-03
  • 2015-11-02
相关资源
最近更新 更多