【问题标题】:list sorting using apply function of Tcl使用 Tcl 的 apply 函数进行列表排序
【发布时间】:2018-01-04 09:20:54
【问题描述】:

假设我有一个如下列表:

set listNums {0 -1 5 5 -5 1 10 100 -10 -10 1000}

我想使用绝对值对其进行排序。我从另一个脚本中选择了以下内容。我很难理解这一点。有人可以帮我理解下面的脚本中发生了什么吗?我使用“puts”在每个阶段打印出值,但我仍然没有得到它!

“a”和“b”如何更新?为什么我们需要“返回 0”?
对不起,如果我问的是基本问题。

lsort -command {apply {
  {a b}
  {
    if {[expr {abs($a)] < [expr {abs($b)}]} {return -1}
    if {[expr {abs($a)] > [expr {abs($b)}]} {return 1}
    if {$a < $b} {return -1}
    if {$a > $b} {return 1}
    return 0
  }
}} $listNums

【问题讨论】:

    标签: sorting tcl apply expr


    【解决方案1】:

    在排序过程中每次比较两个元素时,一个作为 a 传递到此调用中,另一个作为 b 传递。

    比较的结果可以是“小于”、“大于”或“等于”,编码为返回值 -1、1 或 0。

    也可以试试

    if {abs($a) < abs($b)} ... 
    

    相反:if 隐式调用 expr 的条件。

    而且不要比较两次。

    文档: apply, if, lsort

    【讨论】:

    • 谢谢彼得。我仍然不清楚排序列表最终是如何打印的。如果我取列表中的前两个元素,则 a = 0 且 b=-1。因为 abs(0)
    • lsort 不打印列表。它创建并返回一个新列表,其中包含根据给定命令排序的相同元素。命令调用的返回值只有在 lsort 比较元素时才能看到。简单来说,当按升序排序时,返回值 0 或 1 表示当前这对元素是有序的,而结果为 -1 则告诉 lsort 元素顺序错误。
    • 在交互模式下使用 tclsh 时,tcl shell 将打印最后执行的命令的结果。但是如果你把命令放在一个文件中并且:tclsh myfile.tcl,除非你输入一个puts,否则不会有输出。
    • Peter,我在第一个“if”语句之前使用了“puts [list $a $b]”来查看 $a 和 $b 的变化。看起来 lsort 正在使用合并排序。你碰巧知道这是不是真的?如果是,那我想我现在明白了整个过程。非常感谢你的帮助。也感谢 Brad 提供的其他见解。
    • @user3512999:根据文档,它确实是mergesort。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2014-03-13
    • 2011-10-31
    相关资源
    最近更新 更多