2016-10-05 5 views
-1

У меня вложенные списки выглядят так:Поиск одних и тех же элементов во вложенных списках - рекурсивная функция

[['CELTIC AMBASSASDOR', 'Warrenpoint'],['HAV SNAPPER', 'Silloth'],['BONAY', 'Antwerp'],['NINA', 'Antwerp'],['FRI SKIEN', 'Warrenpoint']] 

и продолжается. Как я могу найти списки, которые имеют одинаковые вторые элементы, например

['CELTIC AMBASSASDOR', 'Warrenpoint'] 
['FRI SKIEN', 'Warrenpoint'] 

['BONAY', 'Antwerp'] 
['NINA', 'Antwerp'] 

Список слишком долго (я читаю из файла .csv), и я не могу определить, искать которые вещь точно (например: я не могу найти «Antwerp», чтобы найти все Antwerps, потому что не знаю всех текстов в csv-файле), поэтому я решил, что мне нужна рекурсивная функция, которая будет искать, пока не найдут все вложенные списки, разделенные вторым Предметы. Не удалось выяснить, как сделать рекурсивную функцию, если кто-то имеет лучшее решение, очень ценится.

+0

Это выглядит как работа для коллекции или группы, основанная на втором элементе каждого члена списка. – Prune

ответ

2

Здесь нет необходимости использовать рекурсию. Создание словаря с ключом второго элемента и значения всего подсписка, а затем создать результат, который включает в себя только матчи, которые вы заинтересованы в:

import collections 
l = [['CELTIC AMBASSASDOR', 'Warrenpoint'],['HAV SNAPPER', 'Silloth'],['BONAY', 'Antwerp'],['NINA', 'Antwerp'],['FRI SKIEN', 'Warrenpoint']] 
d = collections.defaultdict(list) 
for item in l: 
    d[item[1]].append(item) 

result = dict(item for item in d.items() if len(d[item[0]]) > 1) 

Результат:

>>> import pprint 
>>> pprint.pprint(result) 
{'Antwerp': [['BONAY', 'Antwerp'], ['NINA', 'Antwerp']], 
'Warrenpoint': [['CELTIC AMBASSASDOR', 'Warrenpoint'], 
       ['FRI SKIEN', 'Warrenpoint']]} 
+0

Ничего себе. Наши ответы почти точно совпадают. –

+0

@ juanpa.arrivillaga - Нечетно, как это происходит. : P Я думаю, что ваш включает ложную положительную запись «Silloth»: [['HAV SNAPPER', 'Silloth']]. – TigerhawkT3

+0

Конечно, я не стал фильтровать. Ваш более полный. Я лук –

0
filter(lambda x:x[1] in set(filter(lambda x:zip(*l)[1].count(x)==2,zip(*l)[1])),l) 
+0

Хотя это может ответить на вопрос, было бы более полезно в качестве ответа, если бы вы добавили объяснение, почему это работает. – CDspace