Форум сайта python.su
52
Медленно и неправильно, зато воднустрочку:
>>> mylist = [1,1,2,1,4,5,6,6,8] >>> [elem for idx, elem in enumerate(mylist) if elem not in mylist[:idx]] [1, 2, 4, 5, 6, 8] >>> zip(*filter(lambda (idx, elem): elem not in mylist[:idx], enumerate(mylist)))[1] (1, 2, 4, 5, 6, 8)
seen = set() filter(lambda x: x not in seen and not seen.add(x), mylist)
Отредактировано fata1ex (Авг. 9, 2012 20:26:13)
Офлайн
14
fata1exПерлотрах?
зато воднустрочку:
Офлайн
20
tfoxНу можно и так:
Здесь черт ногу поломает
def unique(_): __ = set() ___ = __.add return [_ for _ in _ if _ not in __ and not ___ (_)]
def unique2(_, __ = type({( )})): __ = type("(_._)", (__,),{'_':__.add}) () return [_ for _ in _ if _ not in __ and not __._(_)]
def unique3(_, __ = type({( )})): __ = type(""" .-=-. .--. __ .' '. / " ) _ .' '. / .-. \ / .-'\ ( \ / .-. \ / / \ \ / / ^ \ `-` / \ `-' / \ `-` / jgs`-.-` '.____.' `.____.'""", (__,), {'_' : __.__dict__[filter(lambda _: '_' not in _, sorted(__.__dict__))[::-1].pop()]})( {( )} ) return [_ for _ in _ if _ not in __ and not __._(_)]

odnochlenКонечно нарушает
А не нарушает ли это концепцию ФП (функция получается грязной, результат для одного элемента зависит от другого)?.
if not collect.add(e) and e not in collect"
Офлайн
0
def unique(lst): [b]seen = set()[/b] result = [] for x in lst: if x in seen: continue seen.add(x) result.append(x) return result
def unique(lst): result = [] for x in lst: if x in result: continue result.append(x) return result
Офлайн
52
Программисту хорошо бы знать базовые структуры данных и понимать, как они работают. Поговаривают, что с этого надо начинать изучать программирование.
Отредактировано fata1ex (Авг. 10, 2012 15:31:54)
Офлайн
0
Вы правы.
reclosedev, использовал множество так там элементы уникальны. В множестве дубликатов не будет. Хотя оператор in прекрасно работает и со списками. Думаю, что потребность использовать множество здесь отпадает.
Офлайн
52
1000 21
bench_set_loop 0.618780851364
bench_list_loop 1.7107770443
10000 21
bench_set_loop 5.74140501022
bench_list_loop 17.0790119171
Отредактировано fata1ex (Авг. 10, 2012 16:00:33)
Офлайн
20
tfoxМножества в Pythone реализованы через Хеш-таблицу.
А зачем здесь использовать множество?
Все прекрасно работает и без множества.
def bench_unique_set(lst): seen = set() result = [] for x in lst: if x in seen: continue seen.add(x) result.append(x) return result def bench_unique_list(lst): result = [] for x in lst: if x in result: continue result.append(x) return result import timeit import random for elem in (10000, 30000, 50000, 100000): mylist = [random.randint(0, elem) for i in range(elem)] print elem, len(set(mylist)) for name, func in [(k,v) for k,v in globals().items() if k.startswith('bench')]: print " %-20s %s" % (name, timeit.timeit( lambda: func(mylist),number = 1)) 10000 6328 bench_unique_set 0.00341678590387 bench_unique_list 0.853494333394 30000 19064 bench_unique_set 0.00928298693915 bench_unique_list 7.69523085824 50000 31700 bench_unique_set 0.0212902408726 bench_unique_list 21.3993917074 100000 63186 bench_unique_set 0.047203690252 bench_unique_list 87.1938787334
Отредактировано EBFE (Авг. 10, 2012 16:00:24)
Офлайн
0
А, понятно. Поскольку массивы данных у меня маленькие то разницы никакой не почувствовал.
Офлайн
14
Зато вот тут человек прочувствовал ее в полной мере.
Офлайн