列表理解,获取匹配的嵌套项

时间:2015-12-04 07:10:15

标签: python

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

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())

1 个答案:

答案 0 :(得分:2)

如果您希望在两个列表之间获得通用元素,可以使用集合来执行此操作:

>>> 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]

此处捕获所有元素(常见和重复)。