有没有办法根据某些功能从列表中获取项目?
我知道有一种方法可以使用lsearch -regexp
通过正则表达式获取项目,但这不是我需要的。
答案 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
命令。)