Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 9, 2012 13:55:39

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти общие элементы

Добрый день!

Есть список:

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

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

т.е
[7, 4]



Отредактировано andreiru (Авг. 9, 2012 13:56:49)

Офлайн

#2 Авг. 9, 2012 14:06:43

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Найти общие элементы

# -*- 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



Офлайн

#3 Авг. 9, 2012 14:08:11

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Найти общие элементы

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:])

Отредактировано reclosedev (Авг. 9, 2012 14:11:53)

Офлайн

#4 Авг. 9, 2012 14:11:52

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Найти общие элементы

reclosedev,
и правда, одна строка у меня лишняя

mylist = [
    [1,4,8,7,6,5],
    [2,4,9,7,3],
    [7,2,4]
]
res= list( set(mylist[0]).intersection(*mylist[1:]) )



Офлайн

#5 Авг. 9, 2012 14:58:28

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Найти общие элементы

reduce(lambda x, y: set(x) & set(y), mylist)
reduce(lambda x, y: x & y, map(set, mylist))



Отредактировано fata1ex (Авг. 9, 2012 14:59:35)

Офлайн

#6 Авг. 10, 2012 03:58:30

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти общие элементы

Спасибо за ваши варианты!

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

res = list( set(mylist[0]).intersection(*mylist[1:]) )
для чего * в *mylist, как это называется ?



Отредактировано andreiru (Авг. 10, 2012 03:58:53)

Офлайн

#7 Авг. 10, 2012 05:58:07

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Найти общие элементы

# -*- 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)

Офлайн

#8 Авг. 10, 2012 08:33:02

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Найти общие элементы

На небольших списках вариант 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, кстати, не спасает вообще :(



Отредактировано fata1ex (Авг. 10, 2012 08:56:59)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version