Есть список:
mylist = [ [1,4,8,7,6,5], [2,4,9,7,3], [7,2,4] ]
подскажите как создать список в котором будут только пересекающиеся элементы ?!
т.е
[7, 4]
mylist = [ [1,4,8,7,6,5], [2,4,9,7,3], [7,2,4] ]
[7, 4]
# -*- 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
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:])
mylist = [ [1,4,8,7,6,5], [2,4,9,7,3], [7,2,4] ] res= list( set(mylist[0]).intersection(*mylist[1:]) )
reduce(lambda x, y: set(x) & set(y), mylist) reduce(lambda x, y: x & y, map(set, mylist))
res = list( set(mylist[0]).intersection(*mylist[1:]) )
# -*- 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
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