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
KomplexKompliziert
User
Beiträge: 20
Registriert: Freitag 29. Juni 2012, 09:05

Hallo zusammen!
ich habe bei der Sortierung hier meine Schwierigkeiten:
Gegeben habe ich:

Code: Alles auswählen

En=['N6N4','N8N9', 'N3N5','N5N6', 'N9N10', 'N1N2', 'N8N1', 'N7N8', 'N3N4', 'N6N3', 'N10N11']
funktionieren. Sortiert sollte das dann wie folgt aussehen:

Code: Alles auswählen

['N1N2', 'N3N4', 'N3N5', 'N5N6', 'N6N3','N6N4', 'N7N8', 'N8N9', 'N9N10','N10N11']
.
D.h. er soll nach der ersten Zahl sortieren und dann nach der zweiten. Mit

Code: Alles auswählen

sorted
klappt es leider nicht.
Hat jemand eine Idee?
Vielen Dank für eure Hilfe
lunar

Code: Alles auswählen

>>> en = ['N6N4','N8N9', 'N3N5','N5N6', 'N9N10', 'N1N2', 'N8N1', 'N7N8', 'N3N4', 'N6N3', 'N10N11']
>>> sorted(en, key=lambda i: tuple(int(m.group(0)) for m in re.finditer(r'\d+', i)))
['N1N2', 'N3N4', 'N3N5', 'N5N6', 'N6N3', 'N6N4', 'N7N8', 'N8N1', 'N8N9', 'N9N10', 'N10N11']
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Oder wenn es tatsächlich immer nur das Format "NxNy" ist:

Code: Alles auswählen

>>> spam = ['N6N4','N8N9', 'N3N5','N5N6', 'N9N10', 'N1N2', 'N8N1', 'N7N8', 'N3N4', 'N6N3', 'N10N11']
>>> sorted(spam, key=lambda x: map(int, filter(bool, x.split("N"))))
['N1N2', 'N3N4', 'N3N5', 'N5N6', 'N6N3', 'N6N4', 'N7N8', 'N8N1', 'N8N9', 'N9N10', 'N10N11']
Das Leben ist wie ein Tennisball.
BlackJack

Alternativ mit `findall()`:

Code: Alles auswählen

In [9]: sorted(en, key=lambda s: map(int, re.findall(r'\d+', s)))
Out[9]: 
['N1N2',
 'N3N4',
 'N3N5',
 'N5N6',
 'N6N3',
 'N6N4',
 'N7N8',
 'N8N1',
 'N8N9',
 'N9N10',
 'N10N11']
KomplexKompliziert
User
Beiträge: 20
Registriert: Freitag 29. Juni 2012, 09:05

Hey super! Hat funktioniert!!!!! Vielen vielen Dank!
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Code: Alles auswählen

>>> x = ['N6N4','N8N9', 'N3N5','N5N6', 'N9N10', 'N1N2', 'N8N1', 'N7N8', 'N3N4', 'N6N3', 'N10N11']
>>> sorted(x, key=lambda x: int(filter(lambda s: s.isdigit(), x)))
['N1N2', 'N3N4', 'N3N5', 'N5N6', 'N6N3', 'N6N4', 'N7N8', 'N8N1', 'N8N9', 'N9N10', 'N10N11']
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
BlackJack

@jbs: Das funktioniert nicht korrekt:

Code: Alles auswählen

In [18]: en = ['N1N23', 'N12N3', 'N2N3']

In [19]: sorted(en, key=lambda x: int(filter(lambda s: s.isdigit(), x)))
Out[19]: ['N2N3', 'N1N23', 'N12N3']

In [20]: sorted(en, key=lambda s: map(int, re.findall(r'\d+', s)))
Out[20]: ['N1N23', 'N2N3', 'N12N3']
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Hatte das map vergessen:

Code: Alles auswählen

>>> sorted(en, key=lambda x: map(int, filter(lambda s: s.isdigit(), x)))
['N1N23', 'N12N3', 'N2N3']
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
BlackJack

@jbs: Das `map()` ändert nichts am falschen Ergebnis, es macht die Sache nur unnötig aufwändiger.
lunar

@jbs: Vlg.

Code: Alles auswählen

>>> s = 'N1N23'
>>> int(filter(lambda s: s.isdigit(), s))
123
>>> map(int, filter(lambda s: s.isdigit(), s))
[1, 2, 3]
>>> import re
>>> map(int, re.findall(r'\d+', s))
[1, 23]
Deine Lösung macht aus allen Ziffern eine Zahl (mit "map" halt in einzelne Ziffern getrennt), der OP aber möchte nach jeder zusammenhängenden Zahl getrennt sortieren.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ah, ok.

Also 2 mal falsch :lol:
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Antworten