HOWTO · Python

在 Python 中获取列表的并集

列表的并集反映了来自不同列表的所有元素将放在一个列表中。

本页内容

在 Python 中,+ 会拼接列表:将第二个列表的元素接在第一个列表后面,并保留重复值。这不同于数学上的集合并集,后者只保留每个不同的值一次,而且不保证元素顺序。需要保留顺序和重复项时使用拼接;需要有序结果时添加 sorted();需要不重复的可哈希值时使用 set()。下面的示例可以独立运行,并展示结果。

使用 + 拼接两个列表并保留重复项

使用 + 拼接两个列表,可以保留它们的顺序和每一次出现的元素。结果是一个新列表,因此两个输入列表仍可供后续使用。

first = ["red", "blue"]
second = ["blue", "green"]

combined = first + second
print(combined)
['red', 'blue', 'blue', 'green']

结果列表先包含 first 中的元素,再包含 second 中的元素;由于 "blue" 在两个输入中都出现,因此结果中有两个 "blue"。这是列表拼接,不是只保留唯一值的并集。

对拼接后的列表排序

先拼接列表,再将结果传给 Python 内置的 sorted() 函数。该函数会返回一个按升序排列的新列表,不会修改输入列表。排序不会移除重复项,因此每次出现的元素都会保留在结果中。

first = [11, 20, 1, 2, 3, 4, 5]
second = [2, 4, 6, 8, 10]

combined = first + second
sorted_combined = sorted(combined)
print(sorted_combined)
[1, 2, 2, 3, 4, 4, 5, 6, 8, 10, 11, 20]

对于数字,元素会按数值大小排序。待排序的值必须能够相互比较;例如,Python 没有为整数和字符串定义通用的升序关系。

拼接两个列表并移除重复项

使用 set() 将拼接后的列表转换为集合;如果代码后续需要列表,再将集合转换回列表。集合会为每个不同的值保留一份,但其迭代顺序不作保证。集合元素必须可哈希,因此这种方法适用于数字和字符串等值,但不适用于嵌套列表。

first = [1, 2, 3, 4, 5]
second = [2, 4, 6, 8, 10]

unique_values = list(set(first + second))
print(unique_values)
[1, 2, 3, 4, 5, 6, 8, 10]

当唯一值是否存在比它们的位置更重要时,可以使用这种方法。如果还需要对合并后的值排序,请再用 sorted() 显式排序。

拼接两个以上的列表并移除重复项

处理多个输入时,可以对集合调用 union(),并将每个列表作为参数传入。union() 是集合的方法;它接受多个可迭代对象,并返回一个包含所有不同可哈希值的集合。如果需要列表类型的返回值,请将结果转换为列表。与两个列表的示例一样,输出顺序不作保证。

first = [1, 2, 3, 4, 5]
second = [2, 4, 6, 8, 10]
third = [5, 6, 7, 8, 11, 15, 18]

unique_values = list(set().union(first, second, third))
print(unique_values)
[1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 15, 18]

要添加另一个列表,只需将它作为另一个参数传给 union()。如果值不可哈希,可以将其转换为合适的可哈希表示,或改用其他去重方法;集合不能直接包含可变列表或字典。