【问题标题】:How to convert a list to a list carrying its element as a list?如何将列表转换为将其元素作为列表携带的列表?
【发布时间】:2019-06-11 22:59:54
【问题描述】:

例如,在 Tcl 中有一个类似的列表, {"A" "B"}

我想将它转换为一个列表,其中每个元素都作为一个列表, {{A} {B}}

我已尝试使用以下代码将其每个元素映射到一个列表。

set List {"A" "B"}
set List [lmap s $List {list $s}]
puts $List

我希望输出是

{A} {B}

但实际输出是

甲乙

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 当 Tcl 对列表进行字符串化时,它只在需要时添加大括号。字符串“A”也是一个有效的列表。

标签: list tcl


【解决方案1】:

您要查找的表单是一个非规范化列表;它不是 Tcl 的列表操作会产生的(因为它们只在需要时添加大括号),但它是它们可以使用的。这意味着,从形式上讲,不推荐!与软件抗争不是一个好计划!

但这是可能的。如果您知道元素的行为相对良好(如果它们有大括号的话,它们内部也有平衡的大括号),那么您可以使用joinformat 来做到这一点:

set List {"A" "B"}
set List [join [lmap x $List {format "{%s}" $x}]]

这适用于大多数列表,但并非所有人都如此小心:

set List {A B}
lappend List "C\{D";  # <== Element with unbalanced braces; *LEGAL* in lists!
puts $List
# ==> A B C\}D
puts [join [lmap x $List {format "{%s}" $x}]]
# ==> {A} {B} {C}D}

解决方法变得越来越扭曲,这就是为什么建议您只使用 Tcl 的内置列表序列化机制,该机制处理任意元素内容(并且经过测试),而不是关心如何简单的单词被格式化。

【讨论】:

    猜你喜欢
    • 2018-07-20
    • 1970-01-01
    • 2023-03-05
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2012-06-05
    • 1970-01-01
    相关资源
    最近更新 更多