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

Montag 30. Juli 2012, 17:12

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

Montag 30. Juli 2012, 17:19

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: 4872
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Montag 30. Juli 2012, 17:24

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

Montag 30. Juli 2012, 17:26

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

Montag 30. Juli 2012, 19:04

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

Dienstag 31. Juli 2012, 01:27

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

Dienstag 31. Juli 2012, 07:31

@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

Dienstag 31. Juli 2012, 18:51

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

Dienstag 31. Juli 2012, 19:25

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

Dienstag 31. Juli 2012, 19:47

@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

Mittwoch 1. August 2012, 01:27

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