web-dev-qa-db-ja.com

TCLはリストから要素を削除します

TCLリストから要素を削除する方法:

  1. インデックス= 4
  2. 値は「aa」です

Googleで検索しましたが、組み込み関数はまだ見つかりませんでした。

20
Narek
set mylist {a b c}
puts $mylist
a b c

インデックスで削除

set mylist [lreplace $mylist 2 2]
puts $mylist 
a b

値で削除

set idx [lsearch $mylist "b"]
set mylist [lreplace $mylist $idx $idx]
puts $mylist
a
43
drysdam

要素を削除するもう1つの方法は、フィルターで除外することです。このTcl 8.5の手法は、リストから指定された要素のallを削除するという点で、他の場所で述べたlsearchlreplaceメソッドとは異なります。

set stripped [lsearch -inline -all -not -exact $inputList $elemToRemove]

ネストされたリストを検索することはしません。これは、Tclがデータ構造の理解にあまり労力を注いでいない結果です。 (ただし、サブリストの特定の要素を比較することで、-indexオプション。

16
Donal Fellows

要素 "b"を置き換えたいとしましょう:

% set L {a b c d}
a b c d

最初の要素1と最後の要素1を何も置き換えません。

% lreplace $L 1 1
a c d
4
icanhasserver

regsubは、リストから値を削除するのにも適している場合があります。

set mylist {a b c}
puts $mylist
  a b c

regsub b $mylist "" mylist

puts $mylist
  a  c
llength $mylist
  2
1
Shawn E

他の人がやったことをまとめただけ

proc _lremove {listName val {byval false}} {
    upvar $listName list

    if {$byval} {
        set list [lsearch -all -inline -not $list $val]
    } else {
        set list [lreplace $list $val $val]
    }

    return $list
}

その後で呼び出します

Inline edit, list lappend
    set output [list 1 2 3 20]
    _lremove output 0
    echo $output
    >> 2 3 20

Set output like lreplace/lsearch
    set output [list 1 2 3 20]
    echo [_lremove output 0]
    >> 2 3 20

Remove by value
    set output [list 1 2 3 20]
    echo [_lremove output 3 true]
    >> 1 2 20

Remove by value with wildcar
    set output [list 1 2 3 20]
    echo [_lremove output "2*" true]
    >> 1 3
1
Todd Horst