我正在尝试使用以下行为获取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 - 独一无二。但这是基于同性恋秩序的排序。
感谢您的帮助
PS:我的变量包含重复的元素,最初重复的元素不会再重复
答案 0 :(得分:3)
字典非常适用于此(假设您希望列表元素之间进行精确的字符串比较),因为它们是订单保留。
proc uniques {theList} {
set d {}
foreach item $theList {dict incr d $item}
return [dict keys $d]
}
然后我们可以这样做:
set newvariable [uniques $variable]
答案 1 :(得分:2)
您可以创建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
。
如果列表真的很长,你可能会考虑这个,避免在列表中查找,并利用你不会在不同的字符串之后再次出现字符串的事实: / p>
proc lunique {l} {
set previous ""
foreach i $l {
if {$previous != $i} {
lappend result $i
set previous $i
}
}
return $result
}
用法:
set newvariable [lunique $variable]
答案 2 :(得分:0)
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