我有以下列表:
['Herb', 'Alec', 'Herb', 'Don']
我想在保留订单的同时删除重复项,因此它将是:
['Herb', 'Alec', 'Don']
我将如何详细地执行此操作:
l_new = []
for item in l_old:
if item not in l_new: l_new.append(item)
有没有办法在一行中完成这项工作?
答案 0 :(得分:5)
您可以使用一组来删除重复项,然后恢复排序。它和你原来的一样慢,是的: - )
>>> sorted(set(l_old), key=l_old.index)
['Herb', 'Alec', 'Don']
答案 1 :(得分:4)
您可以使用OrderedDict
,但我建议您坚持使用for循环。
>>> from collections import OrderedDict
>>> data = ['Herb', 'Alec', 'Herb', 'Don']
>>> list(OrderedDict.fromkeys(data))
['Herb', 'Alec', 'Don']
重申:我认真建议坚持使用for-loop方法,并使用set
跟踪已经看过的项目:
>>> data = ['Herb', 'Alec', 'Herb', 'Don']
>>> seen = set()
>>> unique_data = []
>>> for x in data:
... if x not in seen:
... unique_data.append(x)
... seen.add(x)
...
>>> unique_data
['Herb', 'Alec', 'Don']
如果你只是想变得古怪(严重不要这样做):
>>> [t[0] for t in sorted(dict(zip(reversed(data), range(len(data), -1, -1))).items(), key=lambda t:t[1])]
['Herb', 'Alec', 'Don']
答案 2 :(得分:4)
使用pandas,从列表中创建一个系列,删除重复项,然后将其转换回列表。
import pandas as pd
>>> pd.Series(['Herb', 'Alec', 'Herb', 'Don']).drop_duplicates().tolist()
['Herb', 'Alec', 'Don']
<强>计时强>
来自@StefanPochmann的解决方案是高重复列表的明显赢家。
my_list = ['Herb', 'Alec', 'Don'] * 10000
%timeit pd.Series(my_list).drop_duplicates().tolist()
# 100 loops, best of 3: 3.11 ms per loop
%timeit list(OrderedDict().fromkeys(my_list))
# 100 loops, best of 3: 16.1 ms per loop
%timeit sorted(set(my_list), key=my_list.index)
# 1000 loops, best of 3: 396 µs per loop
对于没有重复的较大列表(例如,只是一系列数字),熊猫解决方案非常快。
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
答案 3 :(得分:2)
如果您真的不关心优化和内容,可以使用以下内容:
s = ['Herb', 'Alec', 'Herb', 'Don']
[x[0] for x in zip(s, range(len(s))) if x[0] not in s[:x[1]]]
请注意,在我看来,你真的应该在你的问题中使用
for
循环或@ juanpa.arrivillaga的答案
答案 4 :(得分:0)
l_new = []
for item in l_old:
if item not in l_new: l_new.append(item)
在一条线上......:
l_new = []
[ l_new.append(item) for item in l_old if item not in l_new]
有哪些行为:
> a = [1,1,2,2,3,3,4,5,5]
> b = []
> [ b.append(item) for item in a if item not in b]
> print(b)
[1,2,3,4,5]
答案 5 :(得分:0)
你可以试试这个:
l = ['Herb', 'Alec', 'Herb', 'Don']
data = [i[-1] for i in sorted([({a:i for i, a in enumerate(l)}[a], a) for a in set({a:i for i, a in enumerate(l)}.keys())], key = lambda x: x[0])]
输出:
['Alec', 'Herb', 'Don']
此算法仅删除重复值的第一个实例。