【问题标题】:TCL list data to histogramTCL列表数据转直方图
【发布时间】:2020-02-01 22:24:28
【问题描述】:

我正在做一些数据分析,输出是一长串数字。每行由 1 到 n 个数字组成,可以重复:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 4

我想将它们放入(时间序列)直方图中。我不是 tcl 方面的专家(还不是?),我有一些想法如何做到这一点,但我还没有成功。 puts 语句只是为了让我可以看到正在发生的事情。


while { [gets $infile line] != -1 } {
    set m [llength $line]
    puts "line length $m"
    foreach item $line {
        puts $item
        incr nc($item)
        puts "nc: $nc($item)"
    }
}

我创建的这个 nc 数组给了我一个基于大小的数组。但是,我想要一个基于每行的数组(2D)。天真地它会是 nc($item)($nlines)。我最初尝试用 nc${item}($nlines) 等长度标记数组变量,但我不够聪明,无法让它工作。

感谢您的帮助。 最好的 迈克

【问题讨论】:

  • 显示你想看到的输出。 Tcl 数组是严格一维的。您可以使用dict 来制作字典
  • 我不确定nlines 的信息来自哪里,你现在的问题是,如果nlinesitem 的大小不同。跨度>
  • Glenn,(此时不是真正输出)将是 nc1(1) = 20, nc2(1) = 8, nc3(1) = 2, nc4(1) = 1,其中数组索引是原始数据文件的行号。这是我尝试过的事情之一:nc${item}($lineno) 或类似的,但我的输出是变量名本身而不是值.. 谢谢!
  • Jerry,在我的示例中,nlines 是正在读取的文件的长度。你的评论对我来说似乎不完整。谢谢!
  • 小心地将 string $line 视为 list -- 如果它包含不平衡的大括号,则会出现错误。注意使用splitjoin 在字符串和列表之间进行转换——你应该有set m [llength [split $line]]foreach item [split $line] {}

标签: arrays tcl histogram


【解决方案1】:

虽然 Tcl 数组是一维的,但你可以构造关键字符串来伪造多维:

set lineno -1
set fh [open infile r]

while {[gets $fh line] != -1} {
    incr lineno
    foreach item [split [string trim $line]] {
        incr nc($lineno,$item)
    }
}
close $fh

# `parray` is a handy command for inspecting arrays
parray nc

输出

nc(0,1) = 20
nc(0,2) = 8
nc(0,3) = 2
nc(0,4) = 1
nc(1,1) = 2
nc(1,2) = 4
nc(1,4) = 3
nc(2,1) = 1
nc(2,2) = 1
nc(2,3) = 1
nc(2,4) = 1

或者使用字典:

set lineno -1
set nc {}
set fh [open infile r]

while {[gets $fh line] != -1} {
    set thisLine {}
    foreach item [split [string trim $line]] {
        dict incr thisLine $item
    }
    dict set nc [incr lineno] $thisLine
}
close $fh

dict for {line data} $nc {
    puts [list $line $data]
}

输出

0 {1 20 2 8 3 2 4 1}
1 {1 2 2 4 4 3}
2 {1 1 2 1 3 1 4 1}

【讨论】:

  • 嗨格伦!好的,我认为(第一个示例)有效。 parray 命令确实吐出了内容,尽管顺序有些随机(这不重要,因为我可以像在普通数组中一样控制索引,我会收集吗?)。我想我需要检查split 并加入命令。非常感谢您的帮助!
  • 它实际上与“随机顺序”完全相反——它是按词法排序的。见core.tcl-lang.org/tcl/artifact/a0b1bd4e68dce176
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多