Форум сайта python.su
0
Добрый день!
Есть список:
mylist = [ [1,4,8,7,6,5], [2,4,9,7,3], [7,2,4] ]
[7, 4]
Отредактировано andreiru (Авг. 9, 2012 13:56:49)
Офлайн
568
# -*- coding:utf-8 -*- mylist = [ [1,4,8,7,6,5], [2,4,9,7,3], [7,2,4] ] l=map(set, mylist) res= list( l[0].intersection(*l[1:]) ) print res
Офлайн
173
mylist = [ [1,4,8,7,6,5], [2,4,9,7,3], [7,2,4] ] result = set(mylist[0]) for lst in mylist[1:]: result.intersection_update(lst)
:result = set(mylist[0]) result.intersection_update(*mylist[1:])
Отредактировано reclosedev (Авг. 9, 2012 14:11:53)
Офлайн
568
reclosedev,
и правда, одна строка у меня лишняя
mylist = [ [1,4,8,7,6,5], [2,4,9,7,3], [7,2,4] ] res= list( set(mylist[0]).intersection(*mylist[1:]) )
Офлайн
52
reduce(lambda x, y: set(x) & set(y), mylist) reduce(lambda x, y: x & y, map(set, mylist))
Отредактировано fata1ex (Авг. 9, 2012 14:59:35)
Офлайн
0
Спасибо за ваши варианты!
Какой из вариантов наиболее быстрый или так не скажешь проверять нужно ?
res = list( set(mylist[0]).intersection(*mylist[1:]) )
Отредактировано andreiru (Авг. 10, 2012 03:58:53)
Офлайн
568
# -*- coding:utf-8 -*- def foo(*args):# Эта функция примет любое количество неименованных аргументов print type(args) print args for i in args:# в кортеже args будут храниться все переданные параметры print i lst=[1,2,3] print 'Передаем список' foo(lst) print 'Передаем распакованный из списка набор парамертов' foo(*lst)
Передаем список <type 'tuple'> ([1, 2, 3],) [1, 2, 3] Передаем распакованный из списка набор парамертов <type 'tuple'> (1, 2, 3) 1 2 3
Отредактировано FishHook (Авг. 10, 2012 05:59:52)
Офлайн
52
На небольших списках вариант FishHook'a немного быстрее, на больших быстрее мой.
import timeit import random def bench_fishhook(mylist): return list(set(mylist[0]).intersection(*mylist[1:])) def bench_mine(mylist): return list(reduce(lambda x, y: x & y, map(set, mylist))) N = 100 for elements in (10, 100, 1000, 10000): mylist = [[random.randint(0, 20) for i in range(elements)] for _ in xrange(elements if elements < 10000 else elements / 10)] print elements 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=N))
10
bench_mine 0.00375699996948
bench_fishhook 0.00111508369446
100
bench_mine 0.0882270336151
bench_fishhook 0.07865691185
1000
bench_mine 5.51196789742
bench_fishhook 6.65590782166
10000
bench_mine 50.1006538868
bench_fishhook 62.5206859112
Отредактировано fata1ex (Авг. 10, 2012 08:56:59)
Офлайн