2012-04-03 25 views

Antwort

3

Die übliche Idiom ist mit einem sortieren Schlüssel:

>>> a = [[1,2],[2,10,10],[3,4,'fred']] 
>>> b = [2,1,3] 
>>> sorted(a,key=lambda x: b.index(x[0])) 
[[2, 10, 10], [1, 2], [3, 4, 'fred']] 

Diese Fragen Leistung haben kann, though-- wenn die Schlüssel hashable sind, ist dies wahrscheinlich schneller sein wird für lange Listen:

>>> order_dict = dict(zip(b, range(len(b)))) 
>>> sorted(a,key=lambda x: order_dict[x[0]]) 
[[2, 10, 10], [1, 2], [3, 4, 'fred']] 
+1

Das wäre ein schöner Platz für die Funktionszusammensetzung: 'key = b.index. itemgetter (0) ':) Leider Python hat es nicht eingebaut :( –

0

Also, wenn ich Sie richtig verstehe, haben Sie Ihre Probe Eingabeliste:

a = [['18411971', 'kinase_2', 36], ['75910712', 'unnamed...', 160], ... 

und Sie wollen, dass diese sortieren, eine zusätzliche Liste mit, die die Reihenfolge erwähnt, in der die ersten Elemente der Unterlisten sind in der Ausgabe auftreten:

aux = ['75910712', '18411971', ...] 

Wenn das stimmt, dann denke ich, das Ergebnis mit so etwas wie erreicht werden kann:

sorted(a, key = lambda x: aux.index(x[0])) 
+0

Vielen Dank Mann, hat perfekt funktioniert! – cc211

2

Wie wäre es mit:

inputlist = [['18411971', 'kinase_2', 36], ['75910712', 'unnamed...', 160], ... # obviously not valid syntax 
auxinput = aux = ['75910712', '18411971', ...] # ditto 
keyed = { sublist[0]:sublist for sublist in inputlist } 
result = [keyed[item] for item in auxinput] 

Die Sortierung ist hier nicht erforderlich. Bei großen Listen wäre das schneller, weil es O(n) statt O(n * log n) ist.

Falls die Schlüssel nicht eindeutig sind, ist es möglich, eine Variante eines geordneten Diktats zu verwenden (z. B. defaultdict(list) gemäß Vorschlag von Niklas B.), um die verschlüsselte Darstellung zu erstellen.

+0

Dies setzt voraus, dass die ersten Einträge eindeutig sind, aber das könnte sehr wohl der Fall sein. +1. – DSM

+1

+1, während dies ausführlicher ist Anstatt mit 'auxinput.index' als Schlüssel zu sortieren, ist es ungefähr die gleiche Menge an Code wie bei der diktierten Sortierung.Wenn die Einträge nicht eindeutig wären, könnte man ein' defaultdict' verwenden, um einen 'Schlüssel-> [Werte zu erstellen ] 'Assoziation und dann verwenden Sie [[keyed [x] für Element in Auxinput für x in Element]', was immer noch "O (n)" wäre, wenn die Anzahl der Duplikate begrenzt ist. –

Verwandte Themen