2016-10-05 88 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

根據每個列表成員的第二個元素,這看起來像一個Collection或groupby的工作。 – 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

相關問題