在以下模式中获取列表的唯一元素

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