Seite 1 von 1

Sortieren

Verfasst: Montag 30. Juli 2012, 17:12
von KomplexKompliziert
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

Re: Sortieren

Verfasst: Montag 30. Juli 2012, 17:19
von 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']

Re: Sortieren

Verfasst: Montag 30. Juli 2012, 17:24
von EyDu
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']

Re: Sortieren

Verfasst: Montag 30. Juli 2012, 17:26
von 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']

Re: Sortieren

Verfasst: Montag 30. Juli 2012, 19:04
von KomplexKompliziert
Hey super! Hat funktioniert!!!!! Vielen vielen Dank!

Re: Sortieren

Verfasst: Dienstag 31. Juli 2012, 01:27
von jbs

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']

Re: Sortieren

Verfasst: Dienstag 31. Juli 2012, 07:31
von 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']

Re: Sortieren

Verfasst: Dienstag 31. Juli 2012, 18:51
von jbs
Hatte das map vergessen:

Code: Alles auswählen

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

Re: Sortieren

Verfasst: Dienstag 31. Juli 2012, 19:25
von BlackJack
@jbs: Das `map()` ändert nichts am falschen Ergebnis, es macht die Sache nur unnötig aufwändiger.

Re: Sortieren

Verfasst: Dienstag 31. Juli 2012, 19:47
von 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.

Re: Sortieren

Verfasst: Mittwoch 1. August 2012, 01:27
von jbs
Ah, ok.

Also 2 mal falsch :lol: