使用 TCL 查找字典中值的最大绝对值

Find the max absolute value of values in a dict using TCL

提问人:Lumpi 提问时间:1/29/2014 更新时间:1/29/2014 访问量:2332

问:

我有一个列表,例如MyList

 set MyList [ list 508 1.648E-01 509 1.670E-01 510 1.701E-01 511 1.740E-01 512 1.784E-01 ]

如何提取键/值对,其中: 值的绝对值在列表中是最大值?(真是一句话......

在本例中为 512 1.784E-01

我会创建一个 foreach 循环,并在 abs(Value) 大于前一对时保存键值。有没有没有循环的方法?我在 tcl 8.5 上,所以“lsort -stride”技巧遥不可及。

列表 排序 TCL

评论

1赞 Jerry 1/29/2014
当我有键/值对时,我通常将它们成对存储在一个列表中,比如 ,这样我就可以使用 .[list {key1 value1} {key2 value2} ...]lsort -index 1 $MyList

答:

1赞 glenn jackman 1/29/2014 #1

我将创建一个包含键/值子列表的新列表

foreach {k v} $MyList {lappend newlist [list $k $v]}

然后使用

lassign [lindex [lsort -real -index 1 $newlist] end] max_key max_val

评论

0赞 Johannes Kuhn 1/30/2014
或者在 8.6 中,您可以使用lsort -stride 2
2赞 Donal Fellows 1/29/2014 #2

最直接的方法是使用字典进行经典的迭代集合。dict for

set maxVal -Inf
dict for {k v} $MyList {
    if {$v > $maxVal} {
        set maxKey $k
        set maxVal $v
    }
}

这?小于其他所有值的数值。(IEEE算术有时很棒。-Inf

评论

0赞 Donal Fellows 1/29/2014
我不知道这是否会比格伦的答案更快。对于简短的数据集合,也许不是。应该有人测试。但是对于大型词典来说,这应该会获胜,因为它是一个简单的 O(N) 扫描,而不是 O(N) 扫描,然后是 O(NlogN) 排序......