2016-06-22 18 views
2

Ich möchte eine Liste von Tupeln basierend auf einer Anzahl von Schlüsseln sortieren. Zum Beispiel habe ich diese Liste von Tupeln:Wie sortiere ich eine Liste von Tupeln basierend auf den Schlüsseln in einer Liste?

list_t = [(1, 3, 5, 6, 9, 10), (1, 2, 3, 4, 5, 61), (1, 2, 3, 0, 9, 81), (1, 2, 6, 7, 9, 54), (1, 3, 5, 6, 12, 43)] 

Einmal möchte ich es sortieren, die durch die erste, zweite, dritte und fünfte Element der Tupel:

keys = [0, 1, 2, 4] 
list_t_sorted = [(1, 2, 3, 4, 5, 61), (1, 2, 3, 0, 9, 81), (1, 2, 6, 7, 9, 54), (1, 3, 5, 6, 9, 10), (1, 3, 5, 6, 12, 43)] 

Und ein anderes Mal, wenn ich müssen sie sortieren, nur durch das dritte Element der Tupel:

keys = [2] 
list_t_sorted = [(1, 2, 3, 4, 5, 61), (1, 2, 3, 0, 9, 81), (1, 3, 5, 6, 9, 10), (1, 3, 5, 6, 12, 43), (1, 2, 6, 7, 9, 54)] 

Bisher habe ich versucht, diesen Code, aber es die erwarteten Ergebnisse nicht zurück:

def sort_list(keys, list_t): 
    return sorted(list_t, key=lambda l: (l[x] for x in keys)) 

Zum Beispiel für keys = [0, 1, 2, 4] gibt es [(1, 3, 5, 6, 9, 10), (1, 2, 3, 4, 5, 61) zurück , (1, 3, 5, 6, 12, 43), (1, 2, 6, 7, 9, 54), (1, 2, 3, 0, 9, 81)], die nicht auf der Basis der Schlüssel.

Kann mir jemand helfen? Vielen Dank!

+0

Sie sagen, dass es nicht die erwarteten Ergebnisse zurückgibt. Was _does_ es zurück? – Delioth

+0

Eine nicht sortierte Tupelliste basierend auf den Schlüsseln. Für keys = [0, 1, 2, 4] gibt es beispielsweise [(1, 3, 5, 6, 9, 10), (1, 2, 3, 4, 5, 61), (1, 3, 5, 6, 12, 43), (1, 2, 6, 7, 9, 54), (1, 2, 3, 0, 9, 81)], die nicht auf Schlüsseln sortiert sind! – Malgi

Antwort

6

Hier gehen Sie. Sie können mehr über operator.itemgetterhere in the docs lesen.

import operator 
list_t = [(1, 3, 5, 6, 9, 10), (1, 2, 3, 4, 5, 61), (1, 2, 3, 0, 9, 81), (1, 2, 6, 7, 9, 54), (1, 3, 5, 6, 12, 43)] 
keys = [0, 1, 2, 4] 
sorted(list_t, key=operator.itemgetter(*keys)) 

Ausgänge:

[(1, 2, 3, 4, 5, 61), 
(1, 2, 3, 0, 9, 81), 
(1, 2, 6, 7, 9, 54), 
(1, 3, 5, 6, 9, 10), 
(1, 3, 5, 6, 12, 43)] 
+0

Vielen Dank für Ihre schnelle Antwort! – Malgi

2

michael_j_ward Antwort ist eine viel sauberere Lösung auf Ihre Frage, aber wenn Sie wollen wissen, was mit Ihrer ursprünglichen Idee falsch gelaufen ist:

Sie versuchen, zu sortieren Generator-Objekte, die ich vermute, hat eine andere Art der Gleichsetzung. Ein Weg, dies zu zeigen, ist durch die zeigen, was Sie tatsächlich für Schleife mit einem zu sortieren versuchen:

>>> def sort_list(keys, list_t): 
...  for l in list_t: 
...    print (l[x] for x in keys) 
...  return sorted(list_t, key = lambda l: (l[x] for x in keys)) 
... 
>>> sort_list(keys, list_t) 
<generator object <genexpr> at 0x105bc1af0> 
<generator object <genexpr> at 0x105bc1af0> 
<generator object <genexpr> at 0x105bc1af0> 
<generator object <genexpr> at 0x105bc1af0> 
<generator object <genexpr> at 0x105bc1af0> 
[(1, 3, 5, 6, 12, 43), (1, 2, 6, 7, 9, 54), (1, 2, 3, 0, 9, 81), (1, 2, 3, 4, 5, 61), (1, 3, 5, 6, 9, 10)] 

Dies ist offensichtlich nicht beabsichtigter Ausgang, und es hat damit zu tun, wie diese Generatoren verglichen werden. Wenn Sie es mit Ihrer ursprünglichen Idee (ohne itemgetter) tun wollen, erstellen explizit tuples statt Generatoren:

>>> def sort_list(keys, list_t): 
...  return sorted(list_t, key = lambda l: tuple(l[x] for x in keys)) 
... 
>>> sort_list(keys, list_t) 
[(1, 2, 3, 4, 5, 61), (1, 2, 3, 0, 9, 81), (1, 2, 6, 7, 9, 54), (1, 3, 5, 6, 9, 10), (1, 3, 5, 6, 12, 43)] 
+0

Danke für Ihre tolle Aufklärung! – Malgi

Verwandte Themen