在嵌套列表中查找相同的第二个元素 - 递归函数

时间:2016-10-05 23:59:57

标签: python list recursion python-3.4 nested-lists

我有嵌套列表,如下所示;

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

继续。如何找到具有相同第二个元素的列表,例如

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

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

列表太长了(我正在从.csv文件中读取它)而我无法确定要搜索哪个东西(例如:我不能搜索'安特卫普'找到所有安特卫普因为我不喜欢我不知道csv文件中的所有文本,所以我认为我需要一个递归函数来搜索,直到找到所有嵌套列表被第二项分隔。无法弄清楚如何制作递归函数,如果有人有更好的解决方案,非常感谢。

2 个答案:

答案 0 :(得分: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']]}

答案 1 :(得分:0)

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