我有一个名为“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
答案 0 :(得分: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<
a
b
b
几乎就是您想要的(请参阅输出中的第二行)concat
可以根据自己的喜好进行修复。 Donal Fellows指出,我可以使用[concat {*}$b]
而不是[join $b]
。这种方法有几个我喜欢的优点:
{*}
构造然而,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
速度比join
快约30%。
答案 1 :(得分: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 ""]