给定两个输入列表,如何创建两个输入共用的元素列表?
例如:对于输入[1,2,3,4,5,6]和[3,5,7,9],结果应该是[3,5];输入[‘这个’,‘这’,' n ', ', ']和[‘这个’,‘不’,‘,’,','],结果应该[‘这个’,‘,’]。
参见: 在Python中,如何从两个列表中找到常用词,同时保持词序?(维持秩序) Python -多个列表的交集?(用于计算>= 3个列表之间的交集) 两个包含重复项的列表的交集?(保持重复元素)
给定两个输入列表,如何创建两个输入共用的元素列表?
例如:对于输入[1,2,3,4,5,6]和[3,5,7,9],结果应该是[3,5];输入[‘这个’,‘这’,' n ', ', ']和[‘这个’,‘不’,‘,’,','],结果应该[‘这个’,‘,’]。
参见: 在Python中,如何从两个列表中找到常用词,同时保持词序?(维持秩序) Python -多个列表的交集?(用于计算>= 3个列表之间的交集) 两个包含重复项的列表的交集?(保持重复元素)
当前回答
前面的答案都可以找到唯一的公共元素,但不能解释列表中重复的项目。如果你想让公共元素在列表中以相同的数字出现,你可以使用下面的一行代码:
l2, common = l2[:], [ e for e in l1 if e in l2 and (l2.pop(l2.index(e)) or True)]
或True部分仅在您希望任何元素求值为False时才需要。
其他回答
集合是另一种解法
a = [3,2,4]
b = [2,3,5]
set(a)&set(b)
{2, 3}
如果list1和list2是无序的:
使用交叉:
print((set(list1)).intersection(set(list2)))
合并列表并检查元素的出现次数是否大于1:
combined_list = list1 + list2
set([num for num in combined_list if combined_list.count(num) > 1])
类似于上面,但不使用set:
for num in combined_list:
if combined_list.count(num) > 1:
print(num)
combined_list.remove(num)
对于排序列表,没有python特殊的内置,一个O(n)解决方案
p1 = 0
p2 = 0
result = []
while p1 < len(list1) and p2 < len(list2):
if list1[p1] == list2[p2]:
result.append(list1[p1])
p1 += 1
p2 += 2
elif list1[p1] > list2[p2]:
p2 += 1
else:
p1 += 1
print(result)
使用集合交叉,set(list1) & set(list2)
>>> def common_elements(list1, list2):
... return list(set(list1) & set(list2))
...
>>>
>>> common_elements([1,2,3,4,5,6], [3,5,7,9])
[3, 5]
>>>
>>> common_elements(['this','this','n','that'],['this','not','that','that'])
['this', 'that']
>>>
>>>
注意,结果列表可能与原始列表顺序不同。
使用Python的集合交集:
>>> list1 = [1,2,3,4,5,6]
>>> list2 = [3, 5, 7, 9]
>>> list(set(list1).intersection(list2))
[3, 5]
前面的答案都可以找到唯一的公共元素,但不能解释列表中重复的项目。如果你想让公共元素在列表中以相同的数字出现,你可以使用下面的一行代码:
l2, common = l2[:], [ e for e in l1 if e in l2 and (l2.pop(l2.index(e)) or True)]
或True部分仅在您希望任何元素求值为False时才需要。