1

以下の文字列/リストを、最初の要素が 1-81 であるリストに変換するにはどうすればよいですか?

{} {} {1 -81} { } {81 -162} { } {162 -243} { } {243 -324} { } {324 -405} { } {405 -486} { } {486 -567 } { } {567 -648} { } {648 -729} { } {729 -810} { } {810 -891} { } {891 -972} { } {972 -1053} { } {1053 -1134} { }

ありがとう

4

2 に答える 2

2

空のリスト要素を除外したいだけの場合は、次のようにするのが明らかです。

# Assuming the original list is in $list

set result {}
foreach x $list {
    if {[string trim $x] != ""} {
        lappend result $x
    }
}

# The result list should contain the cleaned up list.

[string trim]すべての空の要素が本当に空であり、空白が含まれていないことが確実な場合 ({}おそらく の代わりに意味する) 、 を実行する必要がないことに注意してください{ }。ただし、例には空の要素と空白の両方が含まれているため、文字列のトリムを行う必要があります。

または、正規表現を使用してテストすることもできます。

foreach x $list {
    # Test if $x contains non-whitespace characters:
    if {[regexp {\S} $x]} {
        lappend result $x
    }
}

ただし、lsearch を使用して上記を 1 行で実行できます。

# Find all elements that contain non whitespace characters:

set result [lsearch -inline -all -regexp $list {\S}]
于 2012-11-16T09:36:53.543 に答える
0

次の 2 つの目標を達成したいようです。

  1. 元のリストからすべての空のアイテムを削除します
  2. 空でない項目ごとに、スペースを削除します

別のアプローチを提供したいと思います: フィルタ コマンドを持つ struct::list を使用します。

package require struct::list

set oldList {{} {} {1 -81} { } {81 -162} { } {162 -243} { } {243 -324} {}}
set newList [struct::list filterfor item $oldList {
    [set item [string map {{ } {}} $item]] != ""
}]

このソリューションでstruct::list filterforは、foreach コマンドに似たコマンドを使用します。filterfor の本体はブール式です。本文では、文字列マップを使用して各項目からすべてのスペースを削除し、結果が空でない場合にのみ true を返します。このソリューションは最も効率的ではないかもしれませんが、問題を解決するための別のアプローチです。

于 2012-11-16T15:51:24.380 に答える