在tcl中查找列表的中位数和平均值
我很难找到一种方法来计算一系列数字的中位数和平均值,而Tcl的在线资源似乎非常有限。到目前为止,我只打印了名单上的号码 非常感谢你的帮助在tcl中查找列表的中位数和平均值,tcl,Tcl,我很难找到一种方法来计算一系列数字的中位数和平均值,而Tcl的在线资源似乎非常有限。到目前为止,我只打印了名单上的号码 非常感谢你的帮助 proc ladd {l} { set total 0 set counter 0 foreach nxt $l { incr total $nxt incr counter 1 } puts "$total" puts "$counter" set average ($
proc ladd {l} {
set total 0
set counter 0
foreach nxt $l {
incr total $nxt
incr counter 1
}
puts "$total"
puts "$counter"
set average ($total/$counter)
puts "$average"
}
set a [list 4 3 2 1 15 6 29]
ladd $a
要获得列表的平均值(即算术平均值),只需执行以下操作:
proc average {list} {
expr {[tcl::mathop::+ {*}$list 0.0] / max(1, [llength $list])}
}
将列表中的值求和(trailing0.0
强制结果为浮点值,即使所有添加的数字都是整数),然后除以元素数(如果列表为空,则为1,因此空列表的平均值为0.0,而不是错误)
要获得列表的中间值,必须对其进行排序并选择中间的元素
proc median {list {mode -real}} {
set list [lsort $mode $list]
set len [llength $list]
if {$len & 1} {
# Odd number of elements, unique middle element
return [lindex $list [expr {$len >> 1}]]
} else {
# Even number of elements, average the middle two
return [average [lrange $list [expr {($len >> 1) - 1] [expr {$len >> 1}]]]
}
}
要完成该集合,以下是如何获取列表的模式(如果存在唯一的模式,则与从相当小的集合中选择值的某些应用程序相关):
我将把处理空的和非唯一的案例作为练习。列表中是否只有一个元素?目标是获得所有列表元素的中位数还是每个列表中的中位数?Tcl现在的在线资源似乎非常有限?目标是获得一个列表中所有元素的中位数,因此在我的示例中,元素4、3、2、1您知道如何使用笔和纸获得中位数和平均值吗?平均值为(4+3+2+1)/4,即2.5,中间数为中间数。但是我很难将其转换为tcl代码。
proc mode {list} {
# Compute a histogram
foreach val $list {dict incr h $val}
# Sort the histogram in descending order of frequency; type-puns the dict as a list
set h [lsort -stride 2 -index 1 -descending -integer $h]
# The mode is now the first element
return [lindex $h 0]
}