Найти - Пользователи
Полная версия: Найти общие элементы
Начало » Python для новичков » Найти общие элементы
1
andreiru
Добрый день!

Есть список:

mylist = [
    [1,4,8,7,6,5],
    [2,4,9,7,3],
    [7,2,4]
]

подскажите как создать список в котором будут только пересекающиеся элементы ?!

т.е
[7, 4]
FishHook
# -*- 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
reclosedev
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)

upd

А если у FishHook подсмотреть :
result = set(mylist[0])
result.intersection_update(*mylist[1:])
FishHook
reclosedev,
и правда, одна строка у меня лишняя
mylist = [
    [1,4,8,7,6,5],
    [2,4,9,7,3],
    [7,2,4]
]
res= list( set(mylist[0]).intersection(*mylist[1:]) )
fata1ex
reduce(lambda x, y: set(x) & set(y), mylist)
reduce(lambda x, y: x & y, map(set, mylist))
andreiru
Спасибо за ваши варианты!

Какой из вариантов наиболее быстрый или так не скажешь проверять нужно ?

res = list( set(mylist[0]).intersection(*mylist[1:]) )
для чего * в *mylist, как это называется ?
FishHook
# -*- 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
fata1ex
На небольших списках вариант 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

imap, кстати, не спасает вообще :(
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