以下列模式获取列表的uniqe元素

时间:2015-05-19 10:22:03

标签: sorting tcl

我正在尝试使用以下行为获取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:我的变量包含重复的元素,最初重复的元素不会再重复

3 个答案:

答案 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