在以下模式中获取列表的唯一元素
Getting uniqe elements of the list in the following pattern
我正在尝试使用以下行为获取 lsort 命令,假设我有一个变量 &
set variable {a a a a b b b b c c c c }
期望的输出是
a b c d
如果变量是
set variable { b b d d c c c c }
期望的输出是
b d c
如果变量是
set variable { z z z a a a b b }
期望的输出是
z a b
基本上我想要列表的唯一元素,但首先重复的元素应该首先出现在输出中,最后重复的元素应该出现在最后。以上是我的情况可能出现的情况
我试过 lsort - unique 。但这是基于字母顺序的排序。
感谢您的帮助
PS : 我的变量肯定包含重复的元素,最开始重复的元素最后不会再重复
您可以创建一个 proc
来执行此操作(Tcl8.5 及更高版本):
proc lunique {l} {
set result {}
foreach i $l {
if {$i ni $result} {lappend result $i}
}
return $result
}
对于 8.5 之前的版本,您将使用 [lsearch $result $i] == -1
而不是 $i ni $result
。
如果列表 真的 长,您可以考虑这个避免在列表中查找并利用这样一个事实,即您没有在不同的字符串之后再次出现的字符串字符串:
proc lunique {l} {
set previous ""
foreach i $l {
if {$previous != $i} {
lappend result $i
set previous $i
}
}
return $result
}
用法:
set newvariable [lunique $variable]
字典非常适合此操作(前提是您希望在列表元素之间进行精确的字符串比较),因为它们保留顺序。
proc uniques {theList} {
set d {}
foreach item $theList {dict incr d $item}
return [dict keys $d]
}
那么我们可以这样做:
set newvariable [uniques $variable]
set a {a a s s d d e e f f g g}
for {set i 0} {$i < [llength $a]} {incr i} {
set j [expr $i + 1]
if {[string equal [lindex $a $i] [lindex $a $j]] == 1} {
continue
} else {
lappend b [lindex $a $i]
}
}
puts $b
我正在尝试使用以下行为获取 lsort 命令,假设我有一个变量 &
set variable {a a a a b b b b c c c c }
期望的输出是
a b c d
如果变量是
set variable { b b d d c c c c }
期望的输出是
b d c
如果变量是
set variable { z z z a a a b b }
期望的输出是
z a b
基本上我想要列表的唯一元素,但首先重复的元素应该首先出现在输出中,最后重复的元素应该出现在最后。以上是我的情况可能出现的情况
我试过 lsort - unique 。但这是基于字母顺序的排序。
感谢您的帮助
PS : 我的变量肯定包含重复的元素,最开始重复的元素最后不会再重复
您可以创建一个 proc
来执行此操作(Tcl8.5 及更高版本):
proc lunique {l} {
set result {}
foreach i $l {
if {$i ni $result} {lappend result $i}
}
return $result
}
对于 8.5 之前的版本,您将使用 [lsearch $result $i] == -1
而不是 $i ni $result
。
如果列表 真的 长,您可以考虑这个避免在列表中查找并利用这样一个事实,即您没有在不同的字符串之后再次出现的字符串字符串:
proc lunique {l} {
set previous ""
foreach i $l {
if {$previous != $i} {
lappend result $i
set previous $i
}
}
return $result
}
用法:
set newvariable [lunique $variable]
字典非常适合此操作(前提是您希望在列表元素之间进行精确的字符串比较),因为它们保留顺序。
proc uniques {theList} {
set d {}
foreach item $theList {dict incr d $item}
return [dict keys $d]
}
那么我们可以这样做:
set newvariable [uniques $variable]
set a {a a s s d d e e f f g g}
for {set i 0} {$i < [llength $a]} {incr i} {
set j [expr $i + 1]
if {[string equal [lindex $a $i] [lindex $a $j]] == 1} {
continue
} else {
lappend b [lindex $a $i]
}
}
puts $b