Skip to content

Sortieren einer Liste von numerischen Strings in Python

Python

In Python können Sie eine Liste mit der Methode sort() oder der Funktion sorted() sortieren.

Dieser Artikel genau, wie SIE EINE Liste numerischer Buchstaben sortieren, die nicht mit Nullen gefüllt sind.

  • sort() und sorted()
  • Hinweise zu Zahlenfolgen, die nicht mit Nullen gefüllt sind
  • Geben Sie int() oder float() für den Schlüsselparameter an
  • Zahlen in Strings mit regulären Ausdrücken extrahieren
    • Nur eine Zahl in einer Zeichenfolge
    • Mehr als eine Zahl in einer Zeichenfolge
    • Einige Elemente haben keine Nummer in einer Zeichenfolge

sort() und sorted()

sort() ist eine Methode einer Liste, sterben die ursprüngliche Liste selbst sortiert.

l = [10, 1, 5]

l.sort()
print(l)
# [1, 5, 10]

sorted() ist eine eingebaute Funktion, sterben eine neue sortierte Liste erstellt. Die ursprüngliche Liste wird nicht verändert.

l = [10, 1, 5]

print(sorted(l))
# [1, 5, 10]

print(l)
# [10, 1, 5]

Standardmäßig erfolgt die Sortierung in aufsteigender Reihenfolge. Wenn Sie in absteigender Reihenfolge sortieren möchten, setzen Sie den Reverse-Parameter auf True. Das Beispiel used sorted(), aber SIE can auch sort() verwenden.

print(sorted(l, reverse=True))
# [10, 5, 1]

Weitere Informationen, einschließlich zum Sortieren von Tupeln und Zeichenfolgen, finden Sie im following Artikel.

Hinweise zu Zahlenfolgen, die nicht mit Nullen gefüllt sind

Bei Einer Liste von mit Nullen gefüllten Ziffernfolgen WIRD dies problemlos sortiert. Beachten Sie, dass der folgende Beispielcode sorted() verwendet, aber dasselbe gilt für sort().

l = ['10', '01', '05']

print(sorted(l))
# ['01', '05', '10']

Im Fall einer Liste mit numerischen Buchstaben, die nicht mit Nullen gefüllt sind, werden die Buchstaben in der Wörterbuchreihenfolge sortiert, nicht als Zahlen. Beispiel gilt „10“ als kleiner als „5“.

l = ['10', '1', '5']

print(sorted(l))
# ['1', '10', '5']

Geben Sie int() oder float() für den Schlüsselparameter an

sort() und sorted() haben den Schlüsselparameter.

Durch die Angabe von int() oder float(), die einen String in eine Zahl umwandeln, wird für den Schlüsselparameter eine Liste numerischer Strings als Zahlen und nicht als Strings sortiert.

Wenn eine Funktion als Argument angegeben WIRD, ist () nicht erforderlich.

l = ['10', '1', '5']

print(sorted(l, key=int))
# ['1', '5', '10']

print(sorted(l, key=float))
# ['1', '5', '10']

Integer-Strings können entweder mit int() oder float() konvertiert werden, aber Dezimalzahlen müssen mit float() konvertiert werden.

l = ['10.0', '1.0', '5.0']

print(sorted(l, key=float))
# ['1.0', '5.0', '10.0']

Die sort() hat auch den Schlüsselparameter.

l = ['10', '1', '5']

l.sort(key=int)
print(l)
# ['1', '5', '10']

Wie SIE den bisherigen Ergebnis entnehmen können, WIRD die für Schlüssel angegebene Funktion nur zum Vergleich angewendet und das Ergebnis bleibt das Original.

Wenn Sie das Ergebnis in int oder float haben möchten, sortieren Sie einfach die konvertierte Liste nach Listenverständnissen.

l = ['10', '1', '5']

print([int(s) for s in l])
# [10, 1, 5]

print(sorted([int(s) for s in l]))
# [1, 5, 10]

Für numerische Strings müssen SIE nur int() oder float() für key angeben.

Für Zeichenfolgen mit eingebetteten Zahlen müssen Sie jedoch das reguläre Ausdrucksmodul re verwenden, um den numerischen Teil der Zeichenfolge zu extrahieren.

l = ['file10.txt', 'file1.txt', 'file5.txt']

Nur eine Zahl in einer Zeichenfolge

Holen Sie sich ein Übereinstimmungsobjekt durch search() und nehmen Sie den übereinstimmenden Teil als Zeichenfolge mit der Methode group().

Verwenden Sie d+ als reguläres Ausdrucksmuster. d ist eine Zahl, + ist eine Wiederholung von oder einem Zeichen und entspricht einer mehreren Folge von einer oder mehreren Zahlen.

import re

s = 'file5.txt'

print(re.search(r'd+', s).group())
# 5

Dieser Beispielcode verwendet eine unformatierte Zeichenfolge.

Da ein String zurückgegeben WIRD, verwenden SIE int() oder float(), um ihn in eine Zahl umzuwandeln.

print(type(re.search(r'd+', s).group()))
# <class 'str'>

print(type(int(re.search(r'd+', s).group())))
# <class 'int'>

Mit Einem Lambda-Ausdruck können Sie diesen Prozess für den Schlüsselparameter von sort() oder sorted() angeben.

l = ['file10.txt', 'file1.txt', 'file5.txt']

print(sorted(l))
# ['file1.txt', 'file10.txt', 'file5.txt']

print(sorted(l, key=lambda s: int(re.search(r'd+', s).group())))
# ['file1.txt', 'file5.txt', 'file10.txt']

Wenn die Anzahl der Elemente gering ist, & SIE Sich keine allzu großen Sorgen machen, aber es ist effizienter, ein regelmäßiges Ausdrucksobjekt mit compile() zu generieren und zu verwenden.

p = re.compile(r'd+')
print(sorted(l, key=lambda s: int(p.search(s).group())))
# ['file1.txt', 'file5.txt', 'file10.txt']

Mehr als eine Zahl in einer Zeichenfolge

search() gibt nur die erste Übereinstimmung zurück.

s = '100file5.txt'

print(re.search(r'd+', s).group())
# 100

findall() gibt alle passenden Teile als Liste zurück.

print(re.findall(r'd+', s))
# ['100', '5']

print(re.findall(r'd+', s)[1])
# 5

Wenn Sie Teile eines Musters in () einschließen, können Sie nur diesen Teil mit der Methode groups() extrahieren.

Beispiel extrahiert das Muster file(d+) “ aus ‚file‘. Beachten Sie, dass es ein Tupel zurückgibt, selbst wenn es nur einen entsprechenden Teil gibt.

print(re.search(r'file(d+)', s).groups())
# ('5',)

print(re.search(r'file(d+)', s).groups()[0])
# 5

(d+). Auszüge aus..

print(re.search(r'(d+).', s).groups()[0])
# 5

Beispiele:

l = ['100file10.txt', '100file1.txt', '100file5.txt']

print(sorted(l, key=lambda s: int(re.findall(r'd+', s)[1])))
# ['100file1.txt', '100file5.txt', '100file10.txt']

print(sorted(l, key=lambda s: int(re.search(r'file(d+)', s).groups()[0])))
# ['100file1.txt', '100file5.txt', '100file10.txt']

print(sorted(l, key=lambda s: int(re.search(r'(d+).', s).groups()[0])))
# ['100file1.txt', '100file5.txt', '100file10.txt']
p = re.compile(r'file(d+)')
print(sorted(l, key=lambda s: int(p.search(s).groups()[0])))
# ['100file1.txt', '100file5.txt', '100file10.txt']

Einige Elemente haben keine Nummer in einer Zeichenfolge

Wenn die Zeichenfolgen aller Elemente Zahlen enthalten, gibt es kein Problem, aber wenn nicht, sollten Sie den Fall einer Nichtübereinstimmung berücksichtigen.

l = ['file10.txt', 'file1.txt', 'file5.txt', 'file.txt']

# print(sorted(l, key=lambda s:int(re.search(r'd+', s).group())))
# AttributeError: 'NoneType' object has no attribute 'group'

Definieren Sie beispielsweise die folgende Funktion. Der erste Parameter ist eine Zeichenfolge, der zweite ein reguläres Ausdrucksobjekt und der dritte der Rückgabewert, wenn er nicht gefunden wird.

def extract_num(s, p, ret=0):
    search = p.search(s)
    if search:
        return int(search.groups()[0])
    else:
        return ret

Das Ergebnis ist wie folgt. Das Muster benötigt (), weil es groups() verwendet.

p = re.compile(r'(d+)')

print(extract_num('file10.txt', p))
# 10

print(extract_num('file.txt', p))
# 0

print(extract_num('file.txt', p, 100))
# 100

Das dritte Argument ist optional.

Sie können diese Funktion für den Schlüsselparameter von sort() oder sorted() angeben.

print(sorted(l, key=lambda s: extract_num(s, p)))
# ['file.txt', 'file1.txt', 'file5.txt', 'file10.txt']

print(sorted(l, key=lambda s: extract_num(s, p, float('inf'))))
# ['file1.txt', 'file5.txt', 'file10.txt', 'file.txt']

Wenn SIE Elemente, die keine Zahlenwerte enthalten, an das Ende der aufsteigenden Reihenfolge stellen möchten, can SIE die Unendlichkeit inf verwenden.

Wenn eine Zeichenfolge mehr als eine Zahl enthält, ändern Sie das reguläre Ausdrucksobjekt.

l = ['100file10.txt', '100file1.txt', '100file5.txt', '100file.txt']

p = re.compile(r'file(d+)')
print(sorted(l, key=lambda s: extract_num(s, p)))
# ['100file.txt', '100file1.txt', '100file5.txt', '100file10.txt']

print(sorted(l, key=lambda s: extract_num(s, p, float('inf'))))
# ['100file1.txt', '100file5.txt', '100file10.txt', '100file.txt']