我有两个列表,我需要将匹配的项目作为集合。
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())
答案 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]
此处捕获所有元素(常见和重复)。