я мог бы сделать что-то вроде этого:
>>> sets = [set(tuple(lst) for lst in sublist) for sublist in a]
>>> sets
[set([(1, 2), (2, 3)]), set([(1, 2), (3, 4)]), set([(1, 2), (2, 4), (1, 4)])]
>>> sets[0].intersection(*sets[1:])
set([(1, 2)])
Первый шаг, чтобы понять, что некоторые питона структур данных может помочь. set
может легко найти пересечение, если элементы хешируются. list
не хешируются, но tuple
есть и преобразование между ними легко. Итак, первый шаг - превратить ваши подсписные списки в набор кортежей.
Вот осуществляется в первой строке:
sets = [set(tuple(lst) for lst in sublist) for sublist in a]
Отсюда, при условии, что у вас есть по крайней мере один набор в sets
, вы можете просто обрывать первый и пересекают его со всеми остальными , Дать его немного более пространно, чем выше:
first_set = sets[0]
rest_of_sets = sets[1:]
intersection = first_set.intersection(*rest_of_sets)
Теперь у вас есть пересечение (это set
, который содержит tuple
). Мы можем легко разгадать, что обратно в списки, если вы хотите:
list_intersection = [list(item) for item in intersection]
Вы также можете написать: intersection = set.intersection(*sets)
- Это может быть даже крошечные немного более эффективным ...
Возможный дубликат [Python - Пересечение двух списков] (http://stackoverflow.com/questions/642763/python-intersection-of-two-lists) – wnnmaw
@wnnmaw - Если я читаю, что другой вопрос правильно, этот определитель y не является дураком этого ... – mgilson
его непонятно, каков фактический вопрос? 1,2 присутствует во всех подсписок (вы говорите, что 3 ... но 3 все есть ... что, если был 4-й подсписк, который не содержал 1,2? ... это намерение? –