2016-06-06 7 views
0

У меня есть список списков списков. Есть ли способ, чтобы я мог пересечь их. Для например .:Общие элементы списка списков списков

a=[[[1, 2], [2, 3]], [[1, 2], [3, 4]], [[1, 2], [1, 4], [2, 4]]] 

Из этого, как я могу получить [1,2] как результат, который является общим элементом этих 3-х списков списков?

+0

Возможный дубликат [Python - Пересечение двух списков] (http://stackoverflow.com/questions/642763/python-intersection-of-two-lists) – wnnmaw

+1

@wnnmaw - Если я читаю, что другой вопрос правильно, этот определитель y не является дураком этого ... – mgilson

+0

его непонятно, каков фактический вопрос? 1,2 присутствует во всех подсписок (вы говорите, что 3 ... но 3 все есть ... что, если был 4-й подсписк, который не содержал 1,2? ... это намерение? –

ответ

2

я мог бы сделать что-то вроде этого:

>>> 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) - Это может быть даже крошечные немного более эффективным ...

+0

'уменьшить (set.instersection, ...)'? : P –

+0

Hm, уменьшить ... [Судьба reduce() в Python 3000] (http://www.artima.com/weblogs/viewpost.jsp?thread = 98196) ;-) – Dilettant

+1

@JoranBeasley Как насчет 'set.intersection (* sets)'? ... Не знаю, почему я не думал об этом раньше ... – mgilson

Смежные вопросы