从列表中检索选择性项目



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

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

在 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 命令。

最新更新