2016-10-05 4 views
-1

Ich habe verschachtelte Listen sieht so aus;Die gleichen zweiten Elemente in verschachtelten Listen finden - rekursive Funktion

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

und geht weiter. Wie kann ich die Listen finden, die gleichen zweite Elemente, zum Beispiel

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

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

Die Liste ist zu lang (ich es aus einer CSV-Datei zu lesen bin) und ich kann nicht, welche Sache genau zu suchen, bestimmen (zB: Ich kann nicht nach 'Antwerpen' suchen, um alle Antwerps zu finden, weil ich nicht alle Texte in der csv-Datei kenne), also dachte ich, ich brauche eine rekursive Funktion, die sucht, bis alle verschachtelten Listen nach Sekunden getrennt sind Artikel. Konnte nicht herausfinden, wie man die rekursive Funktion macht, wenn jemand eine bessere Lösung hat, sehr geschätzt.

+0

Dies sieht wie ein Job für eine Sammlung oder eine Gruppe aus, basierend auf dem zweiten Element eines jeden Listenmitglieds. – Prune

Antwort

2

Hier ist keine Rekursion erforderlich. Erstellen Sie ein Wörterbuch mit einem Schlüssel des zweiten Elements und die Werte des gesamten sublist, dann ein Ergebnis schaffen, dass nur die Spiele enthält, die Sie sich interessieren:

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) 

Ergebnis:

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

Wow. Unsere Antworten sind fast identisch. –

+0

@ juanpa.arrivillaga - Seltsam, wie das passiert. : P Ich denke, deine enthält einen falsch positiven Eintrag "Silloth": [['HAV SNAPPER', 'Silloth']]], obwohl. – TigerhawkT3

+0

Sicher, ich habe nicht die Mühe zu filtern. Deines ist vollständiger. Ich verbeuge mich –

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

Während dies die Frage beantworten könnte, wäre es nützlicher als eine Antwort, wenn Sie eine Erklärung hinzufügen, warum das funktioniert. – CDspace

Verwandte Themen