Сравнение вложенных списков Python - PullRequest
3 голосов
/ 08 января 2010

У меня есть два вложенных списка, каждый из которых содержит две строки, например ::1001

list 1 [('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')] and list 2 [('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')]

Я хотел бы сравнить два списка и восстановить те вложенные списки, которые идентичны друг другу. В этом случае будет возвращено только ('DEF','[2,3,4]'). Списки могут быть длинными. Есть ли эффективный способ сделать это?

Ответы [ 6 ]

8 голосов
/ 08 января 2010

Если списки содержат только строковые кортежи, то самый простой способ сделать это - использовать пересечение множеств (&):

>>> set([('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')]) & set([('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')])
set([('DEF', '[2,3,4]')])
3 голосов
/ 08 января 2010

Использование наборов для этого - очень хорошая реализация, но для оптимальной производительности вы должны использовать только один набор:

set1 = set([('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')])
matches = [x for x in [('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')] if x in set1]
0 голосов
/ 12 декабря 2012
     python 3.2
     [i for i in list1 for v in list2 if i==v]
0 голосов
/ 08 января 2010
intersection = [item for item in list1 if item in list2]

Но используйте его, только если по какой-то причине в ваших списках есть изменчивые файлы, и вы не можете преобразовать их в набор. Конечно, все зависит от размера ваших списков и количества дубликатов, но это может быть в 10 раз медленнее.

0 голосов
/ 08 января 2010

Просто используйте set встроенную поддержку для наборов

def get_set(list1,list2):
    s = set(list1)
    s &= set(list2)
    return s

И Бум вот твой союз

0 голосов
/ 08 января 2010

Вот один из подходов. Преобразуйте свои списки в наборы и найдите их пересечения.

>>> a,b = set([('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')]), set([('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')])
>>> print a.intersection(b)
set([('DEF', '[2,3,4]')])

Не думаю, что это сильно ухудшит длину ваших списков.

...