提问人:user1521062 提问时间:11/13/2023 最后编辑:Kelly Bundyuser1521062 更新时间:11/15/2023 访问量:79
如何在 Python 中有效地合并和删除重复的列表?[复制]
How to merge and deduplicate lists in Python efficiently? [duplicate]
问:
我想在 Python 中有效地合并和分解多个列表。有 10 个列表/pd。系列,每个都有大约 200k 个字符串元素(它们的长度不同)。它们中的每一个都已分类。列表有 ~90% 的重叠元素。如何有效地合并它们并删除重复数据?
我可以使用下面的代码来实现合并和排序,但是我们有更有效的方法吗?性能在这里很重要。(由于开销,不喜欢使用 Cython)
targetList = list()
for l in lists:
targetList += l
targetList = list(set(targetList))
targetList = targetList.sort()
我也知道我可以先线性合并所有列表(顺序保留),然后用哈希集线性删除重复数据(实际上这两个步骤可以合并)。
但是,这样的列表合并没有内置函数,我担心我自己的代码,具有线性复杂性,可能会带来额外的开销,进而变得比具有简单系统内置函数的 NlogN 算法慢。我正在使用Python3.9
我知道这篇文章是重复数据删除的,但我的问题有很多功能,我认为还有优化的余地。
答:
2赞
PortorogasDS
11/13/2023
#1
您可以尝试使用 heapq.merge 方法合并排序的可迭代对象,然后应用线性重复数据删除步骤来实现高效的合并和重复数据删除。 有一个例子:
import heapq
# Assuming 'lists' is a list of sorted lists/pd.Series
merged = list(heapq.merge(*lists))
# Linear deduplication
deduplicated = [merged[0]] + [value for prev, value in zip(merged, merged[1:]) if prev != value]
heapq.merge 方法避免了创建中间列表,为大型数据集提供了良好的内存效率。总体时间复杂度为 O(N * log(k)),其中 N 是所有列表中的元素总数,k 是输入列表的数量
1赞
Goku - stands with Palestine
11/13/2023
#2
您也可以尝试:
import itertools
lists = [['a','b','c'],['d','e','f']]
list(dict.fromkeys(itertools.chain.from_iterable(lists))) # dict.fromkeys will presever the order
因为,你已经对内部列表进行了逐个元素的排序,所以你将有值。
#output
['a', 'b', 'c', 'd', 'e', 'f']
评论