Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 27, 2011 09:30:48

anshik
От:
Зарегистрирован: 2011-01-26
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаление одинаковых элементов в списке.

pyuser
А если товарищ anshik имеет возможность вместо списка списков получить список кортежей, то тогда вообще ни какой головной боли
Имеет, и думаю над этим. Спасибо.
Я вчера пробовал, жалко что tuple немутируемый, а список не хешируемый :) первое решение удалять элемент и заменять его другим.

Кстати, а в 2.7 список хешируется для набора?



Офлайн

#2 Янв. 27, 2011 09:41:04

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Удаление одинаковых элементов в списке.

anshik
Кстати, а в 2.7 список хешируется для набора?
нет :(
anshik
жалко что tuple немутируемый, а список не хешируемый
тогда, наверно, Вам следует остановиться на варианте с reduce - типы элементов списка на входе и на выходе одинаковы



Отредактировано (Янв. 27, 2011 09:47:17)

Офлайн

#3 Янв. 27, 2011 09:43:24

Борисенков Сергей
От:
Зарегистрирован: 2011-01-11
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаление одинаковых элементов в списке.

О сколько нам открытий чудных….
В общем так:
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)
т.е. делаем выводы :)



Офлайн

#4 Янв. 27, 2011 10:26:16

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Удаление одинаковых элементов в списке.

Борисенков Сергей, согласен, reduce для больших списков не годится :(

Борисенков Сергей
т.е. делаем выводы
вывод был сделан еще на первой странице - вариант с set - самый быстрый, даже с обратным преобразованием кортежей в списки, он остается самым быстрым :)
list(imap(list, set(imap(tuple, data))))



Офлайн

#5 Янв. 27, 2011 10:26:45

anshik
От:
Зарегистрирован: 2011-01-26
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаление одинаковых элементов в списке.

Спасибо, помогли. Я понял где нужно было переходить на наборы :) Просто при пробегании по двум спискам складывать элементы полученные в набор. И тогда не нужно чистить получившийся список. Понимаю, что немого зря мучил, но может кому другому пригодится, или в другой раз понадобится. :)

    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



Офлайн

#6 Март 9, 2011 00:42:20

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаление одинаковых элементов в списке.

Перенес вопрос в отдельную тему: http://python.su/forum/viewtopic.php?pid=67899#p67899



Отредактировано (Март 9, 2011 00:48:06)

Офлайн

#7 Апрель 6, 2015 10:13:46

degid
От: Ясиноватая
Зарегистрирован: 2012-12-04
Сообщения: 49
Репутация: +  1  -
Профиль   Отправить e-mail  

Удаление одинаковых элементов в списке.

через set и zip не сохраняется сортировка.
“Модный вариант” сохраняет.

l = [e for i,e in enumerate(l) if e not in l[:i]]



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version