Tcl8.5 Listen: numerische Werte extrahieren und sortieren
21. April 2010 | 15:19:47
Ziel: numerische Werte aus einer Liste extrahieren und sortiert ausgeben.
Wir erstellen uns erst einmal eine Beispiel-Liste mit entsprechenden Werten:
Nun sortieren wir den Inhalt der Liste (absteigend) und speichern das Ergebnis in der Variablen liste (überschreiben deren alten Wert):
Das Ergebnis bzw. der neue Inhalt von liste sieht dann so aus:
Nun bestimmen wir den Index in der Liste, an dem der erste numerische Wert zu finden ist:
Jetzt können wir die numerischen Werte auslesen (vom ermittelten Index idx bis zum Ende end der Liste:
Wir erhalten als Ergebnis:
Dies sortieren wir nun noch (z.B. aufsteigend):
Wichtig ist hierbei die Angabe des Parameters -integer. Wir erhalten dann:
Wenn man das Ganze zusammenfasst, so erhält man z.B.:
Wir erstellen uns erst einmal eine Beispiel-Liste mit entsprechenden Werten:
set liste {a b c 10 3 45 d e 4 6 hallo 5}Nun sortieren wir den Inhalt der Liste (absteigend) und speichern das Ergebnis in der Variablen liste (überschreiben deren alten Wert):
set liste [lsort -decreasing $liste]Das Ergebnis bzw. der neue Inhalt von liste sieht dann so aus:
hallo e d c b a 6 5 45 4 3 10Nun bestimmen wir den Index in der Liste, an dem der erste numerische Wert zu finden ist:
set idx [lsearch -regexp $liste {[0-9]+}]Jetzt können wir die numerischen Werte auslesen (vom ermittelten Index idx bis zum Ende end der Liste:
set num_liste [lrange $liste $idx end]Wir erhalten als Ergebnis:
6 5 45 4 3 10Dies sortieren wir nun noch (z.B. aufsteigend):
lsort -integer -increasing $num_listeWichtig ist hierbei die Angabe des Parameters -integer. Wir erhalten dann:
3 4 5 6 10 45Wenn man das Ganze zusammenfasst, so erhält man z.B.:
set liste [lsort -decreasing $liste]
#
# Weiß man, dass die Liste immer mindestens einen numerischen Wert enthält,
# so kann man ohne catch auskommen
#
lsort -integer -increasing [lrange $liste [lsearch -regexp $liste {[0-9]+}] end]
#
# Falls man aber davon ausgehen muss, dass es keinen einzigen numerischen Wert in
# der Liste geben könnte, so kann man dies mittels catch abfangen
#
if { [catch {lsort -integer -increasing [lrange $liste [lsearch -regexp $liste
{[0-9]+}] end]} result] } {
puts "Kein numerischer Wert enhalten :: $result"
} else {
puts "Ergebnis: $result
}


Beispiele für BBCodes:
[indent][b]alert[/b]("Hallo");
</script>[/code]
Hinweis: Mittels "Vorschau ausschalten" kann man die Live-Preview-Funktion abschalten. Dies kann sich vorteilhaft auf die Geschwindigkeit bei der Texteingabe auswirken.