如何在Python中有效地合并和删除重复列表?

yk9xbfzb  于 12个月前  发布在  Python
关注(0)|答案(2)|浏览(157)

此问题在此处已有答案

Fastest union for multiple sorted lists removing duplicates and get an ordered result(3个答案)
2天前关闭。
我想在Python中高效地合并和decuplicate多个列表。有10个列表/pd.Series,每个列表都有大约200 k个 string 元素(它们 * 不 * 具有相同的长度)。每个列表都被排序**。列表有**~90%的重叠元素**。我如何高效地 * 合并它们并删除
我可以使用下面的代码来实现合并和排序,但是我们有更有效的方法吗?性能在这里很重要。(由于开销,我不喜欢使用Cython)

targetList = list()
for l in lists:
  targetList += l
targetList = list(set(targetList))
targetList = targetList.sort()

字符串
我还知道我可以先线性地合并所有列表(顺序保持),然后用散列集线性地去重(实际上这两个步骤可以合并)。
然而,没有内置的函数来进行这样的列表合并,我担心我自己的代码,w/线性复杂度,可能会带来额外的开销,从而变得比具有简单系统内置函数的NlogN算法更慢。
我知道this post用于重复数据删除,但我的问题有许多功能,我认为有优化的空间。

k3bvogb1

k3bvogb11#

您可以尝试使用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是输入列表的数量

pod7payv

pod7payv2#

您也可以尝试:

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']

相关问题