【问题标题】:List comprehension, get matching nested item [duplicate]列表理解,获取匹配的嵌套项[重复]
【发布时间】:2016-03-09 01:23:47
【问题描述】:

我有两个列表,我需要将匹配的项目作为集合获取。

list1 = [1,2,3]
list2 = [1,2,3,4]
a = [(x, y) for x in list1 if x in [y for y in list2]]

它正确获取 X,但正如预期的那样,它只给出嵌套列表 (y) 中的第一项,而不是匹配项。

完成这项工作并获得匹配的 X 和 Y 的最简单方法是什么?有什么方法可以避免使用正则表达式?

更新:为了更清楚,上面只是示例 - 实际代码是:

list1 = [(x, y) for x in new_ids if x.KWuser in [y.keyword for y in get_existing_KeyO]]

new_ids 和 get_existing_KeyO 是来自 2 个不同模型的项目列表:

get_existing_KeyO = list(KeyO.objects.filter(
keyword__in=[x['keyword'] for x in related_data]).all())

【问题讨论】:

  • 你的意思是两个列表之间的共同元素?
  • if x in [y for y in list2]if x in list2 相同,但速度较慢。这是一个侧面评论,你的问题没有意义 - 如果它们都是......为什么你想要这对......相同的价值?为什么不[(x, x) for x in list1 if x in list2] ?如果你想要不同的值,那么听起来你想要一个键/值匹配 - 和一个字典,而不是两个列表。
  • set(list1).intersection(list2)?
  • 我更新了原来的问题。

标签: python


【解决方案1】:

如果您希望获得两个列表之间的共同元素,您可以使用集合来实现:

>>> set(list1).intersection(list2)
set([1, 2, 3])

但请记住,这只会返回给您常见的元素(没有重复的元素),示例:

>>> list1 = [1,2,3,7]
>>> list2 = [1,2,3,4,7,8,7,7,7]
>>> set(list1).intersection(list2)
set([1, 2, 3, 7])

如果这是你想要的,你也可以用列表理解来做到这一点,这样:

>>>list1 = [1,2,3]
>>>list2 = [1,2,3,4]
>>>a = [x for x in list1 if x in list2]
>>> a
[1, 2, 3]

这里的列表理解将被list1 的长度耗尽,所以如果你有:

>>> list1 = [1,2,3,7]
>>> list2 = [1,2,3,4,7,8,7,7,7]
>>> a = [x for x in list1 if x in list2]
>>> a
[1, 2, 3, 7]

你不会得到最后一个元素7,7,7,因为搜索已经被list1的长度用尽(限制)了,但是如果你用这种方式反转它:

>>> a = [x for x in list2 if x in list1]
>>> a
[1, 2, 3, 7, 7, 7, 7]

这里所有元素(常见的和重复的)都被捕获。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    相关资源
    最近更新 更多