OrderedDict
сохранит порядок и предоставит вам уникальные элементы, как только мы сопоставим подсписок с кортежами, чтобы сделать их хешируемыми, используя t[:]
, чтобы мы могли изменить исходный объект/список.
t = [["a", "b"], ["c", "d"], ["a", "e"], ["f", "g"], ["c", "d"]]
from collections import OrderedDict
t[:] = map(list, OrderedDict.fromkeys(map(tuple, t)))
print(t)
[['a', 'b'], ['c', 'd'], ['a', 'e'], ['g', 'f']]
Для python2 вы можете использовать itertools.imap
, если вы хотите, чтобы избежать создания промежуточных списков:
from collections import OrderedDict
from itertools import imap
t[:] = imap(list, OrderedDict.fromkeys(imap(tuple, t)))
print(t)
Вы также можете использовать set.add or
логику:
st = set()
t[:] = (st.add(tuple(sub)) or sub for sub in t if tuple(sub) not in st)
print(t)
Какой бы самый быстрый подход :
In [9]: t = [[randint(1,1000),randint(1,1000)] for _ in range(10000)]
In [10]: %%timeit
st = set()
[st.add(tuple(sub)) or sub for sub in t if tuple(sub) not in st]
....:
100 loops, best of 3: 5.8 ms per loop
In [11]: timeit list(map(list, OrderedDict.fromkeys(map(tuple, t))))
10 loops, best of 3: 24.1 ms per loop
Кроме того, если ["a","e"]
считается такой же, как ["e","a"]
вы можете использовать frozenset:
t = [["a", "b"], ["c", "d"], ["a", "e"], ["f", "g"], ["c", "d"], ["e","a"]]
st = set()
t[:] = (st.add(frozenset(sub)) or sub for sub in t if frozenset(sub) not in st)
print(t)
Выход:
[['a', 'b'], ['c', 'd'], ['a', 'e'], ['f', 'g']]
Чтобы избежать двух вызовов кортежа вы можете сделать функцию:
def unique(l):
st, it = set(), iter(l)
for tup in map(tuple, l):
if tup not in st:
yield next(it)
else:
next(it)
st.add(tup)
, который работает немного быстрее:
In [21]: timeit list(unique(t))
100 loops, best of 3: 5.06 ms per loop
Что '' b' и c'? Являются ли они простыми значениями или другими 'list',' dict'? –
Это вопрос порядка? –
Возможный дубликат [Как удалить дубликаты из списка в Python при сохранении заказа?] (Http://stackoverflow.com/questions/480214/how-do-you-remove-duplicates-from-a-list-in -python-while-preserve-order), [Python удаляет дубликаты в списках] (http: // stackoverflow.com/questions/7961363/python-remove-duplicates-in-lists) – GingerPlusPlus