Python中如何对比两个大列表的相同内容并进行合并?
题外话: 在实际中,A 表有 1W 行,B 表只有 4K 行。 当,迭代 A 时,B 迭代一次,然后再从 A 到 B 依次迭代,就会导致,有的行数没有匹配上。 所以,只有,迭代出 A 的中的一行,就得对比 B 中的全部行数,这样才是有效的。
需求:
通过 A,匹配 B,把部分相同内容的两个列表合并(这里要匹配列表前边的数字 11,22,33,44 通过数字来合并其他内容,11 不能和 22 的数据合并,11 要和 11 的数据合并。),要求 4 个列表都要匹配完。 如:
A 的 ['11', 'wqdqwdwd', '允许撒大声地']
匹配到
B 的 ['11', 'ikluhkmug', '允许 dwadwad']
把这两个表合并。
这里要匹配列表前边的数字 11,22,33,44 通过数字来合并其他内容,11 不能和 22 的数据合并,11 要和 11 的数据合并。
使用字典会打乱顺序,所以只能采用列表。
大列表 A:
[
['11', 'wqdqwdwd', '允许撒大声地'],
['22', 'ewrdwewd', '允许打发斯蒂'],
['33', 'hghfgfgh', '允许撒大我地'],
['44', 'gfdgdgrg', '允许伟大无多']
]
大列表 B:
[
['22', 'jhgfghfgh', '允许 dawdadd'],
['33', 'hfghgffgh', '允许 wadawwa'],
['44', 'jyjygjyyd', '允许 dwadwad'],
['11', 'ikluhkmug', '允许 dwadwad']
]
已经进行的尝试:(都失败了)
1、for 迭代大列表 A,B 放进队列,但是 for 和 queue 队列,for 只迭代了一次。
for x in A:
while not q.empty():
wait_list = q.get()
if x[0] in wait_list[0]
这里的 for x in A:只迭代一次就不迭代了。按照正常情况,A 迭代 4 次才对。
id_a = []
for i,j in enumerate(a):
id_a.append((i,j[0]))
print(id_a)
id_b = []
for i,j in enumerate(b):
id_b.append((i, j[0]))
print(id_b)
for i in id_a:
for j,k in enumerate(id_b):
if i[1] == k[1]:
a[i[0]].extend(b[k[0]])
print(a)
for i in a:
del i[3]
print(a)
这里其实就是两个 for 迭代,直接判断,只不过写的复杂化了。
2、把 A 和 B 放进不同的队列,A 队列也只是获取一次内容就不获取了。跟上边的 for 循环一样。
Python中如何对比两个大列表的相同内容并进行合并?
def merge_large_lists(list1, list2):
"""
合并两个大列表,保留所有唯一元素
使用集合提高查找效率,适合处理大数据量
"""
# 将第一个列表转为集合(去重)
set1 = set(list1)
result = list1.copy() # 保留list1所有元素
# 只添加list2中不存在于set1的元素
for item in list2:
if item not in set1:
result.append(item)
set1.add(item) # 更新集合避免重复判断
return result
# 示例用法
if __name__ == "__main__":
# 模拟两个大列表
large_list1 = [1, 2, 3, 4, 5, 2, 3] # 包含重复元素
large_list2 = [4, 5, 6, 7, 8, 6] # 包含重复元素
merged = merge_large_lists(large_list1, large_list2)
print(f"合并后列表: {merged}")
print(f"合并后长度: {len(merged)}")
print(f"唯一元素数: {len(set(merged))}")
# 如果还需要保留原始顺序且需要统计重复,可以用这个版本
def merge_preserve_all(list1, list2):
"""完全保留两个列表的所有元素(包括重复)"""
return list1 + list2
# 如果只需要唯一元素
def merge_unique_only(list1, list2):
"""合并两个列表,只保留唯一元素"""
return list(set(list1) | set(list2))
核心思路:
- 用集合(set)做哈希查找,O(1)时间复杂度比列表遍历O(n)快得多
- 先转集合去重,再逐个判断添加,避免嵌套循环
- 内存允许的话,直接
list(set(list1 + list2))最简单
一句话建议:用集合做去重和查找,别用双层循环。
a = [
[‘11’, ‘wqdqwdwd’, ‘允许撒大声地’],
[‘22’, ‘ewrdwewd’, ‘允许打发斯蒂’],
[‘33’, ‘hghfgfgh’, ‘允许撒大我地’],
[‘44’, ‘gfdgdgrg’, ‘允许伟大无多’]
]
b = [
[‘22’, ‘jhgfghfgh’, ‘允许 dawdadd’],
[‘33’, ‘hfghgffgh’, ‘允许 wadawwa’],
[‘44’, ‘jyjygjyyd’, ‘允许 dwadwad’],
[‘11’, ‘ikluhkmug’, ‘允许 dwadwad’]
]
c = {x[0]: x for x in b}
d = []
for line in a:
if line[0] in c:
c[line[0]] += line[1:]
d.append(c[line[0]]+line[1:])
from pprint import pprint
pprint(“add_list.py:21”)
pprint©
from collections import defaultdict
a = [
[‘11’, ‘wqdqwdwd’, ‘允许撒大声地’],
[‘22’, ‘ewrdwewd’, ‘允许打发斯蒂’],
[‘33’, ‘hghfgfgh’, ‘允许撒大我地’],
[‘44’, ‘gfdgdgrg’, ‘允许伟大无多’]
]
b = [
[‘22’, ‘jhgfghfgh’, ‘允许 dawdadd’],
[‘33’, ‘hfghgffgh’, ‘允许 wadawwa’],
[‘44’, ‘jyjygjyyd’, ‘允许 dwadwad’],
[‘11’, ‘ikluhkmug’, ‘允许 dwadwad’]
]
c = defaultdict(list)
for tmp in a + b:
c[tmp[0]].append(tmp)
#输出
for key in c.keys():
print("{} has {}".format(key,c[key]))

