Oneliner删除重复项,继续订购lis

2024-09-25 10:34:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下清单:

['Herb', 'Alec', 'Herb', 'Don']

我想在保持订单的同时删除重复项,因此应该是:

^{pr2}$

下面是我如何详细地执行此操作:

l_new = []
for item in l_old:
    if item not in l_new: l_new.append(item)

有没有一种方法可以做到这一点?在


Tags: 方法in订单newforifnotitem
3条回答

您可以使用集合来删除重复项,然后恢复顺序。而且跟你原来的一样慢,耶:-)

>>> sorted(set(l_old), key=l_old.index)
['Herb', 'Alec', 'Don']

使用pandas,从列表中创建一个系列,删除重复项,然后将其转换回列表。在

import pandas as pd

>>> pd.Series(['Herb', 'Alec', 'Herb', 'Don']).drop_duplicates().tolist()
['Herb', 'Alec', 'Don']

计时

@StefanPochmann的解决方案显然是高重复列表的赢家。在

^{pr2}$

对于没有重复的较大列表(例如简单的一系列数字),pandas解决方案非常快速。在

my_list = range(10000)

%timeit pd.Series(my_list).drop_duplicates().tolist()
# 100 loops, best of 3: 3.16 ms per loop

%timeit list(OrderedDict().fromkeys(my_list))
# 100 loops, best of 3: 10.8 ms per loop

%timeit sorted(set(my_list), key=my_list.index)
# 1 loop, best of 3: 716 ms per loop

您可以使用OrderedDict,但我建议您坚持使用for循环。在

>>> from collections import OrderedDict
>>> data = ['Herb', 'Alec', 'Herb', 'Don']
>>> list(OrderedDict.fromkeys(data))
['Herb', 'Alec', 'Don']

重申一下:我认真地建议坚持使用for循环方法,并使用set来跟踪已经看到的项目:

^{pr2}$

如果你只是想搞怪(真的不要这样做):

>>> [t[0] for t in sorted(dict(zip(reversed(data), range(len(data), -1, -1))).items(), key=lambda t:t[1])]
['Herb', 'Alec', 'Don']

相关问题 更多 >