2016-09-22 2 views
-5

Gibt es in Python eine Möglichkeit, eine Liste zu sortieren, in der Strings, Floats und Integer enthalten sind?Sortiere eine Liste mit Strings, Floats und Ganzzahlen

Ich habe versucht, list.sort() -Methode zu verwenden, aber natürlich hat es nicht funktioniert. Hier

ist ein Beispiel für eine Liste würde ich sortieren mag:

[2.0, True, [2, 3, 4, [3, [3, 4]], 5], "titi", 1] 

Ich mag es nach Wert von Schwimmern und Ints sortiert werden und dann nach Art: Schwimmer und Ints zuerst, dann Strings , dann Booleans und dann Listen. Ich möchte Python 2.7 verwenden, aber ich darf nicht zu ...

Erwartete Ausgabe:

[1, 2.0, "titi", True, [2, 3, 4, [3, [3, 4]], 5]] 
+5

Und wie genau würden Sie es sein wollen sortiert? –

+0

Half-Witze Antwort: Wechseln Sie zu Python 2.7, wo Vergleiche zwischen Ganzzahlen und Strings usw. erlaubt sind. – Kevin

+0

Wie Teemu fragt - was ist Ihre erwartete Ausgabe? –

Antwort

1

Pythons Vergleichsoperatoren weise verweigern für Variablen inkompatible Typen zu arbeiten. Entscheiden Sie sich für das Kriterium zum Sortieren Ihrer Liste, kapseln Sie es in eine Funktion und übergeben Sie es als key Option an sort(). Zum Beispiel durch die repr jedes Element zu sortieren (a string):

l.sort(key=repr) 

nach Typ sortieren zuerst, dann durch den Inhalt:

l.sort(key=lambda x: (str(type(x)), x)) 

Letzteres hat den Vorteil, dass Nummern sortieren erhalten numerisch, Strings alphabetisch usw. Es wird immer noch fehlschlagen, wenn es zwei Unterlisten gibt, die nicht verglichen werden können, aber dann müssen Sie entscheiden, was zu tun ist - erweitern Sie einfach Ihre Schlüsselfunktion, wie Sie es für richtig halten. ein Wörterbuch mit Typen als Schlüssel

+0

Ich bin froh, es zu hören, aber beachte den Disclaimer: Es drückt das Problem nur einen Schritt weiter. Sie müssen es Sonderfall, wenn Sie Unterlisten mit zufälligen Inhalten sortieren müssen. – alexis

+0

ein rekursiver/dynamischer Ansatz würde dafür funktionieren. –

+0

@Wayne, gehen Sie dafür. Aber es könnte nicht den Erwartungen des OP entsprechen. Wer weiß. – alexis

0

Die key -Argument zu list.sort oder sorted verwendet werden kann, es so, wie Sie es brauchen zu sortieren, müssen Sie zuerst festlegen, wie Sie die Typen bestellen möchten, einfachste (und wahrscheinlich schnellste) ist und um als Wert

# define a dictionary that gives the ordering of the types 
priority = {int: 0, float: 0, str: 1, bool: 2, list: 3} 

Um diese Arbeit zu machen, man die Tatsache nutzen, dass tuples und lists vergleichen, indem zuerst das erste Element zu vergleichen, und wenn das gleich das zweite Element vergleichen, wenn dieser gleich ist, die dritte vergleichen (und so auf).

# Define a function that converts the items to a tuple consisting of the priority 
# and the actual value 
def priority_item(item): 
    return priority[type(item)], item 

Schließlich können Sie Ihre Eingabe sortieren, ich werde es mischen, da es bereits sortiert ist (soweit ich verstehe Ihre Frage):

>>> l = [1, 2.0, "titi", True, [2, 3, 4, [3, [3, 4]], 5]] 
>>> import random 
>>> random.shuffle(l) 
>>> print(l) 
[True, [2, 3, 4, [3, [3, 4]], 5], 'titi', 2.0, 1] 

>>> # Now sort it 
>>> sorted(l, key=priority_item) 
[1, 2.0, 'titi', True, [2, 3, 4, [3, [3, 4]], 5]] 
Verwandte Themen