2016-07-09 11 views
1

Ich habe eine Liste wie dieseWie lösche Duplikate aus einer verschachtelten Liste basierend auf dem ersten Element, während die Länge der Liste priorisiert wird?

[[7, 6, 8], [1, 10], [3, 10], [7, 8], [7, 4], [9, 4], [5, 8], [9, 8]] 

Und ich möchte, dass die Ausgabe in etwa so aussehen:

[[7, 6, 8],[1, 10],[3, 10],[9, 4],[5, 8]] 

Wenn der Algorithmus Duplikate basierend auf dem ersten Element in der inneren Liste zB entfernen sollte '7','1', '3' usw. bei der Priorisierung der inneren Listenlänge, dh kürzere sollten zuerst entfernt werden.

fand ich etwas ähnliches here und here, wie man den ersten Teil der Frage zu tun dies mit:

dict((x[0], x) for x in any_list).values() 

aber ich weiß nicht, wie die Länge zu priorisieren.

+0

Ist es Ihnen wirklich egal, welche innere Liste entfernt werden sollte, wenn Duplikate die gleiche Länge haben und die Reihenfolge der inneren Listen nicht wichtig ist? Wenn ja, sortiere die äußere Liste zuerst nach der Länge der inneren Liste: https://stackoverflow.com/questions/4735704/ordering-a-list-of-lists-by-lists-len und entferne dann die Duplikate, wie du es erwähnt hast. – StefanS

Antwort

2

Sie können Ihre Liste einfach nach der Länge unter Verwendung sorted(any_list, key=len) sortieren.

könnte Ihr Code wie diese dann aussehen:

dict((x[0], x) for x in sorted(any_list, key=len)).values() 

Wenn Sie eine Liste am Ende haben, füllen Sie einfach das Ergebnis in list() passieren.

+0

Einfach und prägnant, funktioniert perfekt! –

1

Sie können collections.defaultdict() verwenden, um Ihre Listen basierend auf den ersten Punkt zu kategorisieren wählen sie die längere Verwendung max() Funktion mit len() wie es Schlüssel ist:

>>> lst = [[7, 6, 8], [1, 10], [3, 10], [7, 8], [7, 4], [9, 4], [5, 8], [9, 8]] 
>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> 
>>> for i, *j in lst: 
...  d[i].append(j) 
... 
>>> d 
defaultdict(<class 'list'>, {1: [[10]], 3: [[10]], 9: [[4], [8]], 5: [[8]], 7: [[6, 8], [8], [4]]}) 
>>> [[k] + max(v, key=len) for k, v in d.items()] 
[[1, 10], [3, 10], [9, 4], [5, 8], [7, 6, 8]] 

Wenn Sie über die Bestellung kümmern können Sie OrdeedDict() stattdessen verwenden :

>>> from collections import OrderedDict 
>>> d = OrderedDict() 
>>> 
>>> for i, *j in lst: 
...  d.setdefault(i, []).append(j) 
... 
>>> [[k] + max(v, key=len) for k, v in d.items()] 
[[7, 6, 8], [1, 10], [3, 10], [9, 4], [5, 8]] 
Verwandte Themen