Seite 1 von 1
					
				sort() nur bestimmten inhalt
				Verfasst: Dienstag 5. Februar 2008, 11:51
				von Zack
				Ich würde gerne eine Liste anhand von einem kleinen Bereich jedes Elements sortieren. Naja, kurz gesagt: Ich hab jeweils ein String in dem am ende in Klammern eine id steht. Nach dieser würde ich gerne sortieren.
Code: Alles auswählen
def getid(t):
    return int(t[-5:-1])
chrono.sort(key = getid)
Leider klappt das so scheinbar nicht. Ich vermute weil es kein mehrdimensionales Array/Liste ist. Ich hab aber leider keine Umsetzung für nur einfache Arrays/Listen gefunden, entwickeln können.
Inhald sieht zb wie folgt aus: 
Code: Alles auswählen
chrono = ['dell4wobe PROC01: WNS(10000)', 'dell4wobe PROC01: WNS(10056)', 'dell4wobe PROC01: WNS(10188)', 'Blacksheep PROC01: WNS(4832)', 'dell4wobe PROC01: WNS(2548)', 'default']
Ich hab beim stöbern auch diese Variante gefunden:
Code: Alles auswählen
sorted(chrono, key=lambda s: int(s[s.index('(') + 1:s.rindex(')')]))
Leider bekomme ich dabei immer ein "exceptions.ValueError: substring not found" 
Hoffe ihr könnt mir helfen.
Gruß Zack
 
			 
			
					
				Re: sort() nur bestimmten inhalt
				Verfasst: Dienstag 5. Februar 2008, 12:04
				von gerold
				Zack hat geschrieben:Code: Alles auswählen
def getid(t):
    return int(t[-5:-1])
chrono.sort(key = getid)
 
Hallo Zack!
Die Werte sind unterschiedlich lang. Du musst vorher herausfinden, wo die öffnende Klammer steht.
Code: Alles auswählen
>>> chrono = ['dell4wobe PROC01: WNS(10000)', 'dell4wobe PROC01: WNS(10056)', 
...     'dell4wobe PROC01: WNS(10188)', 'Blacksheep PROC01: WNS(4832)', 
...     'dell4wobe PROC01: WNS(2548)']
>>> def get_key(value):
...     return int(value[value.rfind("(") + 1:-1])
...     
>>> get_key(chrono[0])
10000
>>> sorted(chrono, key = get_key)
['dell4wobe PROC01: WNS(2548)', 'Blacksheep PROC01: WNS(4832)', 
'dell4wobe PROC01: WNS(10000)', 'dell4wobe PROC01: WNS(10056)', 
'dell4wobe PROC01: WNS(10188)']
>>> 
mfg
Gerold

 
			 
			
					
				
				Verfasst: Dienstag 5. Februar 2008, 12:09
				von Zack
				Hab's geschafft. Beid der zweiten Variante mussten vorher die "default"-Werte ausgefiltert werden.
Code: Alles auswählen
for i in chrono:
    try: int(i[-5:-1])
    except: chrono.remove(i)
Schön sich selbst helfen zu können =)
edit: Ah danke gerold, dass habe ich ganz übersehen.
 
			 
			
					
				
				Verfasst: Dienstag 5. Februar 2008, 12:09
				von BlackJack
				Das erste kann nicht Funktionieren weil Du verschieden lange Zahlen hast:
Code: Alles auswählen
In [318]: 'dell4wobe PROC01: WNS(10188)'[-5:-1]
Out[318]: '0188'
Das zweite Funktioniert mit den Beispieldaten, die Du zeigst ganz prima:
Code: Alles auswählen
In [319]: sorted(chrono, key=lambda s: int(s[s.index('(') + 1:s.rindex(')')]))
Out[319]:
['dell4wobe PROC01: WNS(2548)',
 'Blacksheep PROC01: WNS(4832)',
 'dell4wobe PROC01: WNS(10000)',
 'dell4wobe PROC01: WNS(10056)',
 'dell4wobe PROC01: WNS(10188)']
Die Ausnahme ist eigentlich auch recht klar: Mindestens eine Zeichenkette auf der Liste auf der Du das *wirklich* anwendest hat keine Zahl in Klammern, weil eine der Klammern nicht gefunden werden kann.
 
			 
			
					
				
				Verfasst: Dienstag 5. Februar 2008, 12:14
				von BlackJack
				Ups. War zu langsam. 
@Zack: Dein Filtern funktioniert nicht zuverlässig.  Wenn man eine Liste verändert, über die man gerade iteriert, können Elemente "übersprungen" oder mehrfach besucht werden.  Benutze am besten `filter()` oder eine "list comprehension" mit ``if``, um eine neue Liste ohne die Default-Werte zu erstellen.
 
			 
			
					
				
				Verfasst: Dienstag 5. Februar 2008, 15:22
				von Zack
				Ah, wieder was gelernt $)
Danke euch, wie immer super hilfreich  

Gruß Zack