Zahlenliste sortieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
16_Bit
User
Beiträge: 21
Registriert: Donnerstag 26. März 2020, 14:14

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?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@16_Bit: die Frage setzt ja früher an, warum sind da Strings in der Liste und keine Zahlen? Woher kommt die Liste?
Benutzeravatar
16_Bit
User
Beiträge: 21
Registriert: Donnerstag 26. März 2020, 14:14

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)
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

`\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
Benutzeravatar
16_Bit
User
Beiträge: 21
Registriert: Donnerstag 26. März 2020, 14:14

Danke für die Hinweise.

Code: Alles auswählen

numbers.append(int(result[1]))
Ich bin ziemlich verblüfft das result[1] nur die Zahl zurück gibt. Woher weiß Python das beim = getrennt werden soll?
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist die Gruppendefinition im regulären Ausdruck.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
16_Bit
User
Beiträge: 21
Registriert: Donnerstag 26. März 2020, 14:14

Guter Hinweis. Spielt in dem Fall zwar keine Rolle, ist aber dennoch lehrreich.
Antworten