Найти - Пользователи
Полная версия: Удаление одинаковых элементов в списке.
Начало » Python для новичков » Удаление одинаковых элементов в списке.
1 2 3 4 5
anshik
pyuser
А если товарищ anshik имеет возможность вместо списка списков получить список кортежей, то тогда вообще ни какой головной боли
Имеет, и думаю над этим. Спасибо.
Я вчера пробовал, жалко что tuple немутируемый, а список не хешируемый :) первое решение удалять элемент и заменять его другим.

Кстати, а в 2.7 список хешируется для набора?
pyuser
anshik
Кстати, а в 2.7 список хешируется для набора?
нет :(
anshik
жалко что tuple немутируемый, а список не хешируемый
тогда, наверно, Вам следует остановиться на варианте с reduce - типы элементов списка на входе и на выходе одинаковы
Борисенков Сергей
О сколько нам открытий чудных….
В общем так:
test3 на большом объеме данных очень медленный - выкинул из теста:
генерируем данные:
import random

def pair_rand_list(start,end,step):

s1='XP{0}:{1}{2}'.format(random.randrange(start,end,step),random.randrange(start,end,step), chr(random.randrange(65,90,1)))
s2='X{0}:{1}'.format(random.randrange(start,end,step),random.randrange(start,end,step))
return [s1,s2]

def create_list(end):
return [ pair_rand_list(1,10,1) for i in xrange(end)]
при data = create_list(300000) следующие результаты:
('test1', 2.3197300215530188)
('test2', 1.7692245802189941)
('test4', 1.0263340731852795)
('test5', 1.0581708010375621)
('test6', 1.2104826172041419)
т.е. делаем выводы :)
pyuser
Борисенков Сергей, согласен, reduce для больших списков не годится :(
Борисенков Сергей
т.е. делаем выводы
вывод был сделан еще на первой странице - вариант с set - самый быстрый, даже с обратным преобразованием кортежей в списки, он остается самым быстрым :)
list(imap(list, set(imap(tuple, data))))
anshik
Спасибо, помогли. Я понял где нужно было переходить на наборы :) Просто при пробегании по двум спискам складывать элементы полученные в набор. И тогда не нужно чистить получившийся список. Понимаю, что немого зря мучил, но может кому другому пригодится, или в другой раз понадобится. :)
    x4_x5 = set()   # находим, если левая и правая часть совпадают, то идем дальше, если уже есть в списке пропускаем
t = time()
for i in x5:
for j in x4:
if i[0] == j[1]: # левые части 5 совпадают с правыми частями 4
#out.append([j[0], i[1]])
x4_x5.add((j[0], i[1]))
elif i[0]==j[0]: # левые части 5 совпадают с левыми частями 4
#out.append([j[1], i[1]])
x4_x5.add((j[1], i[1]))
print time()-t
Время выполнения 8.25с

x4 размером 39402
x5 размером 768
pasaranax
Перенес вопрос в отдельную тему: http://python.su/forum/viewtopic.php?pid=67899#p67899
degid
через set и zip не сохраняется сортировка.
“Модный вариант” сохраняет.
l = [e for i,e in enumerate(l) if e not in l[:i]]
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB