在嵌套列表中查找相同的第二个元素 - 递归函数
Finding the same second elements in nested lists - recursive function
我有这样的嵌套列表;
[['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 文件中的所有文本),所以我想我需要一个递归函数来搜索直到找到由第二个项目分隔的所有嵌套列表。想不通递归函数的实现方法,如果谁有更好的解决办法,不胜感激。
这里不用递归。使用第二个元素的键和整个子列表的值创建一个字典,然后创建一个仅包含您感兴趣的匹配项的结果:
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']]}
filter(lambda x:x[1] in set(filter(lambda x:zip(*l)[1].count(x)==2,zip(*l)[1])),l)
我有这样的嵌套列表;
[['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 文件中的所有文本),所以我想我需要一个递归函数来搜索直到找到由第二个项目分隔的所有嵌套列表。想不通递归函数的实现方法,如果谁有更好的解决办法,不胜感激。
这里不用递归。使用第二个元素的键和整个子列表的值创建一个字典,然后创建一个仅包含您感兴趣的匹配项的结果:
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']]}
filter(lambda x:x[1] in set(filter(lambda x:zip(*l)[1].count(x)==2,zip(*l)[1])),l)