0

私のリストは:

set list {23 12 5 20 one two three four}

期待される出力は昇順ですが、違いはアルファベットを最初に置く必要があることです。

four one three two 12 20 23 5

私は次のことを試しました:

# sorting the list in increasing order:
lsort -increasing $list
-> 12 20 23 5 four one three two
# Here i get the result with numbers first as the ascii value of numbers are higher than alphabets.

 

lsort -decreasing $list
# -> two three one four 5 23 20 12
4

2 に答える 2

2

コンパレータを絞ることをお勧めします:

proc compareItm {a b} {
    set aIsInt [string is integer $a]
    set bIsInt [string is integer $b]

    if {$aIsInt == $bIsInt} {
        # both are either integers or both are not integers - default compare
        # but force string compare
        return [string compare $a $b]
        # if you want 5 before 12, comment the line above and uncomment the following line
        # return [expr {$a < $b ? -1 : $a > $b ? 1 : 0}]
    } else {
        return [expr {$aIsInt - $bIsInt}]
    }
}

そして、次の-commandオプションで使用しますlsort

lsort -command compareItm
于 2013-03-18T13:00:02.487 に答える
0

最も簡単な方法の 1 つは、照合キーを作成し、それらで並べ替えることです。

lmap pair [lsort -index 1 [lmap item $list {
    list $item [expr {[string is integer $item] ? "Num:$item" : "Let:$item"}]
}]] {lindex $pair 0}

Tcl 8.5 または 8.4 (これlmapには がありません) を使用している場合は、より長いバージョンでこれを行います。

set temp {}
foreach item $list {
    lappend temp [list $item [expr {
        [string is integer $item] ? "Num:$item" : "Let:$item"
    }]]
}
set result {}
foreach pair [lsort -index 1 $temp] {
    lappend result [lindex $pair 0]
}
于 2013-03-18T13:27:27.903 に答える