2

假设我有一个看起来像这样的大列表:

一个

ab1 ab2 ab3 ab5 ab6 ac1 ac2 ac3 ac4 ac5 ac6 ac7 ac8 ac9 xy1 xy2 xy3 xy4 xy5 xy6 xy7 xy8 xy9 xy10 xy11

ac1 ac4 ac5 ac6 ac7 ac8 xy2 xy3 xy4 xy5 xy6 

A - B模式后变成这样:

ab1 ab2 ab3 ab5 xy1 ab6 ac2 ac3 xy7 xy9 xy8 xy10 xy11 ac9

现在我必须对所有值进行排序,使其变为

ab1 ab2 ab3 ab5 ab6 ac2 ac3 ac9 xy1 xy7 xy8 xy9 xy10 xy11

然后我需要检查所有序列值的存在,以便我得到序列的第一个和第一个值。在上述情况下

ab1 ab2 ab3 are in sequnce so for this part 1st value = ab1 and last value = ab3
ab5 ab6 --- first value = ab5 and last value ab6
ac2 ac3 --- first value = ac2 and last value = ac3
ac9   --- first value and last value same = ac9 
xy1 --- first value and last value same = xy1
xy7 xy8 xy9 xy10 xy11 --- first value = xy7 and last value = xy7 and last value = xy11

注意:列表或数组中的所有值都是唯一的

4

3 回答 3

2

如果您使用的是 Tcl 8.6,那么lmap是第一个任务的正确工具:

set filtered [lmap e $A {if {$e in $B} continue}]

排序:

set sorted [lsort $filtered]

最后一个任务.. 好,让我们使用前 2 个字符。

set filter {}
set last {}
foreach e $sorted {
    if {[string range $e 0 1] ne $filter} {
       lappend res $last $e
       set filter [string range $e 0 1]
    }
    set last $e
}
lappend res $last
set res [lrange $res 1 end]

现在您有了一个包含第一个和最后一个元素的列表。

于 2013-04-14T10:53:33.037 回答
1

我的不是很漂亮,但它可以解决问题^^;

set group [list "ab1" "ab2" "ab3" "ab5" "ab6" "ac2" "ac3" "ac9" "xy1" "xy7" "xy8" "xy9" "xy10" "xy11"]

set number 0
set pattern 0
set result ""

foreach n $group {
    if {$pattern == 0} {
        set current $n
        lappend result $n
        regexp {([a-z]{2})(\d+)} $n - pattern number
        continue
    }
    regexp {([a-z]{2})(\d+)} $n - match1 match2
    if {$match1 == $pattern && [incr number] == $match2} {
        set current $n
        continue
    } else {
        set pattern $match1
    }
    if {[lsearch $result $current] == -1} {
        lappend result $current
    }
    lappend result $n
    set current $n
    set number $match2
}
lappend result $n

# $result = "ab1 ab3 ab5 ab6 ac2 ac3 ac9 xy1 xy7 xy11"
于 2013-04-14T14:11:42.880 回答
1

查看tcllibstruct::setstruct::list软件包。

于 2013-04-14T10:49:45.177 回答