Nim:根据谓词查找seq中元素的索引
Nim: Find index of element in seq based on predicate
如果我有一个值序列,我如何根据谓词函数找到元素的索引?例如,如果我有以下序列:
let values = @["pie", "cake", "ice cream"]
如何找到第一个有四个字符的元素的索引?我知道 find
,但它似乎只能通过相等查找索引,并且不允许传递谓词。我可以自己实现这个,但感觉如果 find
是的话,它应该在标准库中。
一个简单的解决方案是使用 sequtils
中的 map
将谓词映射到输入序列,然后使用 find
获取第一个 true
结果中的值。这个returns -1 当序列中没有元素满足谓词:
import sequtils
proc isLen4(s: string): bool =
len(s) == 4
echo map(@["pie", "cake", "ice cream"], isLen4).find(true) #--> 1
这可行,但对大序列不利,因为 map
处理整个序列。因此,即使第一个元素满足谓词,整个序列也会被处理。最好只写一个 findIf
过程,当满足谓词时 returns 当前索引,而不是继续处理其余的输入:
proc findIf[T](s: seq[T], pred: proc(x: T): bool): int =
result = -1 # return -1 if no items satisfy the predicate
for i, x in s:
if pred(x):
result = i
break
echo @["pie", "cake", "ice cream"].findIf(isLen4) #--> 1
如果我有一个值序列,我如何根据谓词函数找到元素的索引?例如,如果我有以下序列:
let values = @["pie", "cake", "ice cream"]
如何找到第一个有四个字符的元素的索引?我知道 find
,但它似乎只能通过相等查找索引,并且不允许传递谓词。我可以自己实现这个,但感觉如果 find
是的话,它应该在标准库中。
一个简单的解决方案是使用 sequtils
中的 map
将谓词映射到输入序列,然后使用 find
获取第一个 true
结果中的值。这个returns -1 当序列中没有元素满足谓词:
import sequtils
proc isLen4(s: string): bool =
len(s) == 4
echo map(@["pie", "cake", "ice cream"], isLen4).find(true) #--> 1
这可行,但对大序列不利,因为 map
处理整个序列。因此,即使第一个元素满足谓词,整个序列也会被处理。最好只写一个 findIf
过程,当满足谓词时 returns 当前索引,而不是继续处理其余的输入:
proc findIf[T](s: seq[T], pred: proc(x: T): bool): int =
result = -1 # return -1 if no items satisfy the predicate
for i, x in s:
if pred(x):
result = i
break
echo @["pie", "cake", "ice cream"].findIf(isLen4) #--> 1