从列表中检索选择性项目

时间:2015-04-20 11:35:27

标签: list tcl

有没有办法根据某些功能从列表中获取项目?

我知道有一种方法可以使用lsearch -regexp通过正则表达式获取项目,但这不是我需要的。

1 个答案:

答案 0 :(得分:2)

在Tcl 8.6中,您可以使用lmap命令执行此操作,方法是使用continue跳过您不想要的项目(或break表示您已完成足够的处理):

set items {0 1 2 3 4 5 6 7 8 9 10}
set filtered [lmap i $items {if {$i==sqrt($i)**2} {set i} else continue}]
# Result: 0 1 4 9

这显然可以扩展到一个带有lambda术语和列表的过程。

proc filter {list lambda} {
    lmap i $list {
        if {[apply $lambda $i]} {
            set i
        } else {
            continue
        }
    }
}

set filtered [filter $items {i { expr {$i == sqrt($i)**2} }}]

可以在Tcl 8.5中使用foreach执行类似的操作,但您需要自己做更多的工作来使用lappend构建结果项列表...

proc filter {list lambda} {
    set result {}
    foreach i $list {
        if {[apply $lambda $i]} {
            lappend result $i
        }
    }
    return $result
}

用法相同。 (Tcl 8.4及之前 - 现在不支持 - 不支持apply命令。)