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