2

我有一个名为“a”的列表,需要执行一些基本的列表操作和命令才能在另一个列表“b”中获得所需的结果

此列表“a”可以按我在下面显示的一个示例中的任何顺序包含更多元素

(%) set a {{123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]}} mno}

 {{123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]} mno}

目前,我尝试了这个并得到了

(%) set b ""
(%)    
(%) foreach l $a {
       lappend b [regsub -all [lindex $l 0] $l ""]
    }
(%) puts $b

 {{p_q[5]}} {{r_s[6]}} {}

相反,我希望“b”具有如下输出

p_q[5] r_s[6] mno

Tcl 版本:8.4.6

4

2 回答 2

1

如果我正确理解您的问题,这是一种可能的解决方案:

set a {{123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]}} mno}
puts $a

set b [list]
foreach item $a {
    lappend b [lindex $item end]
}
puts ">$b<"
set b [concat {*}$b]
puts ">$b<"

输出:

{123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]}} mno
>{p_q[5]} {r_s[6]} mno<
>p_q[5] r_s[6] mno<

讨论

  1. 循环遍历列表中的每个项目a
  2. 对于每个项目,选择最后一个子项目并将其附加到b
  3. 列表退出后,b几乎就是你想要的(见输出中的第二行)
  4. 拨打电话concat将根据您的喜好解决此问题。

更新

Donal Fellows 指出[concat {*}$b],我可以使用而不是使用[join $b]。这种方法有几个我喜欢的优点:

  • 它适用于不支持该{*}构造的旧 8.4 系统
  • 理解起来比较简单

但是,该concat方法提供了一个优势:速度。请看以下交互式会话:

(Downloads2) 61 % set b {{p_q[5]} {r_s[6]} mno}
{p_q[5]} {r_s[6]} mno
(Downloads2) 62 % time {concat {*}$b} 10000
0.43452700000000005 microseconds per iteration
(Downloads2) 63 % time {join $b} 10000
0.603005 microseconds per iteration

concat速度比本例快 30%左右join

于 2013-10-03T00:48:48.240 回答
1

所以这里再次为您提供一个班轮:

% set a {{123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]}} mno}
  {123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]}} mno
% set b [lsearch -all -regexp -not -inline [regsub -all "\{|\}" $a ""] ":"]
{p_q[5]} {r_s[6]} mno

如果进一步,您想删除 {},则

%set b [regsub -all "\{|\}" $b ""]
于 2013-10-03T05:24:31.823 回答