Seite 1 von 1
Zahlenliste sortieren
Verfasst: Samstag 20. Juni 2020, 17:49
von 16_Bit
Hallo,
ich habe eine Liste mit Zahlen die ich sortieren möchte. Python bringt ja sogar schon ein list.sort() mit. Leider entspricht das Ergebnis nicht meinen Vorstellungen.
Diese Reihe...
Code: Alles auswählen
zahlenreihe = ['74', '799', '798', '73', '5508', '5506', '72', '800', '5507']
wird zu...
Code: Alles auswählen
zahlenreihe = ['5506', '5507', '5508', '72', '73', '74', ', '798', '799', '800']
aber so hätte ich es gerne.
Code: Alles auswählen
zahlenreihe = ['72', '73', '74', '798', '799', '800', '5506', '5507', '5508']
Man kann mit list.sort() noch einen Key übergeben und so die Sortierung beeinflussen, jedoch bin ich noch nicht darauf gekommen, wie ich zu meinem gewünschten Ergebnis komme. Habt ihr einen Tipp?
Re: Zahlenliste sortieren
Verfasst: Samstag 20. Juni 2020, 17:53
von __deets__
Das sind ja auch keine Zahlen. Das sind Strings. Die zufaellig Zahlen beinhalten, aber das kann Python ja nicht wissen. Darum musst du die entweder einfach zu einer echten Liste von Zahlen machen, und dann wird das sortieren auch ganz grossartig funktionieren. Oder du kannst "int" als key-Argument an sorted benutzen, ja. Normalerweise wird man aber die Liste selbst wandeln.
Re: Zahlenliste sortieren
Verfasst: Samstag 20. Juni 2020, 18:04
von Sirius3
@16_Bit: die Frage setzt ja früher an, warum sind da Strings in der Liste und keine Zahlen? Woher kommt die Liste?
Re: Zahlenliste sortieren
Verfasst: Montag 22. Juni 2020, 06:35
von 16_Bit
Oh man, das da Strings stehen habe ich total übersehen.
Die Daten kommen aus zahlreichen Dateien, die der Reihe nach eingelesen werden.
Code: Alles auswählen
# Dateien mit EMDK0 im Namen finden und Inhalt durchsuchen
def search_number(file_to_search):
numbers = []
for file in glob.glob(file_to_search):
with open(file, 'r', encoding='iso-8859-1') as open_file:
for line in open_file:
result = re.search('dateinummer=["\047][0-9]+["\047]', line)
if result:
numbers.append(int(result[0].split('"')[1].lstrip("0")))
break
numbers.sort()
print(numbers)
Re: Zahlenliste sortieren
Verfasst: Montag 22. Juni 2020, 07:22
von Sirius3
`\047` habe ich ehrlichgesagt auch noch nie gesehen, da muß man ja erst Oktalzahlen umrechnen (\x27). Satt der kryptischen Zahl kann man einfach `\'` schreiben, was man aber auch nicht macht, denn Python kennt 4 verschiedene Arten, wie man Literale Strings definiert, da ist immer eine dabei, die ohne Escapzeichen für Anführungszeichen auskommt.
file ist eher ein filename und open_file nenne ich meistens lines, weil in der Benutzung es egal ist, woher die Zeilen kommen.
Satt den gefundenen String nochmals mit split zu bearbeiten, würde man eine passende Gruppe im regulären Ausdruck definieren. Führende 0-en sind bei int egal und sogar kontraproduktiv, die wegzulöschen, wenn es tatsächlich 0 wäre.
Der Kommentar vor der Funktion schränkt die Nutzung stärker ein, als dass das die Funktion tatsächlich tut. Die Funktion sucht doch mehrere Nummern und sollte die wohl auch per `return` zurückgeben.
Code: Alles auswählen
def search_numbers(file_to_search):
numbers = []
for filename in glob.glob(file_to_search):
with open(filename, 'r', encoding='iso-8859-1') as lines:
for line in lines:
result = re.search('''dateinummer=["']([0-9]+)["']''', line)
if result:
numbers.append(int(result[1]))
break
numbers.sort()
return numbers
Re: Zahlenliste sortieren
Verfasst: Montag 22. Juni 2020, 08:29
von 16_Bit
Danke für die Hinweise.
Ich bin ziemlich verblüfft das result[1] nur die Zahl zurück gibt. Woher weiß Python das beim = getrennt werden soll?
Re: Zahlenliste sortieren
Verfasst: Montag 22. Juni 2020, 08:36
von Sirius3
Das ist die Gruppendefinition im regulären Ausdruck.
Re: Zahlenliste sortieren
Verfasst: Montag 22. Juni 2020, 09:16
von __blackjack__
Ich weiss nicht ob das wirklich wichtig ist, aber dieser Ausdruck würde bei folgendem auch die beiden letzten Zeilen treffen:
Code: Alles auswählen
dateinummer="123"
dateinummer='456'
dateinummer="789' <- Man beachte die "unsymmetrischen" Anfürhrungszeichen
dateinummer='012" <- in den leztzen beiden Fällen.
Wenn man möchte kann man das einfach verhindern. Weil man dazu eine weitere Gruppe braucht würde ich den Gruppen Namen geben, damit man die nicht zählen muss für Rückreferenz und Ergebnis abfragen (ungetestet):
Code: Alles auswählen
def search_numbers(file_to_search):
file_number_re = re.compile(
"""dateinummer=(?P<enclosing>['"])(?P<digits>[0-9]+)(?P=enclosing)"""
)
numbers = []
for filename in glob.glob(file_to_search):
with open(filename, "r", encoding="iso-8859-1") as lines:
for match in map(file_number_re.search, lines):
if match:
numbers.append(int(match["digits"]))
break
numbers.sort()
return numbers
Re: Zahlenliste sortieren
Verfasst: Montag 22. Juni 2020, 10:14
von 16_Bit
Guter Hinweis. Spielt in dem Fall zwar keine Rolle, ist aber dennoch lehrreich.