Dictionary Tcl dict修改密钥名称

Dictionary Tcl dict修改密钥名称,dictionary,tcl,Dictionary,Tcl,假设我有一个dictsomedict,带有key1值1 有没有一种方法可以修改key1,比如说,成为somekey1,而不删除key1并为somekey1创建新记录?您可以lappend字典中的新变量,将旧变量的值设置为新变量,然后取消设置旧键 set somedict [dict create key1 "black dict" key2 "white dict"] //dict update somedict key1 varKey1 { // dict lappend somedi

假设我有一个dict
somedict
,带有
key1值1


有没有一种方法可以修改
key1
,比如说,成为
somekey1
,而不删除
key1
并为
somekey1
创建新记录?

您可以
lappend
字典中的新变量,将旧变量的值设置为新变量,然后
取消设置旧键

set somedict [dict create key1 "black dict" key2 "white dict"]

//dict update somedict key1 varKey1 {
//    dict lappend somedict someKey1 $varKey1
//    unset varKey1
//}
//or 
set rename key1
set to someKey1
set somedict [dict replace $somedict $to {[dict get $somedict $rename][dict unset $somedict $rename]}]

set value [dict get $somedict someKey1]
puts $value
有关更多信息,请转到


如果您正在寻找rename variable命令,那么在TCL中没有这样的命令。

您可以在字典中
lappend
新建变量,并将值从旧变量设置为新变量,然后
取消设置旧键

set somedict [dict create key1 "black dict" key2 "white dict"]

//dict update somedict key1 varKey1 {
//    dict lappend somedict someKey1 $varKey1
//    unset varKey1
//}
//or 
set rename key1
set to someKey1
set somedict [dict replace $somedict $to {[dict get $somedict $rename][dict unset $somedict $rename]}]

set value [dict get $somedict someKey1]
puts $value
有关更多信息,请转到


如果您正在寻找rename variable命令,那么在TCL中没有这样的东西。

您可以利用这样一个事实,即字典也是一个列表,它也是一个字符串

请注意,我通常会告诉您永远不要混合使用操作和清单类型(例如,永远不要在字符串上使用列表操作)。但就像音乐一样,在Tcl,只要你知道自己在做什么,任何规则都可能被打破。(除了十二条语法规则,这些规则是神圣不可侵犯的。)

鉴于这本词典:

% set somedict [dict create key1 "black dict" key2 "white dict"]
key1 {black dict} key2 {white dict}
% dict get $somedict somekey1
black dict
您可以执行字符串转换:

% set somedict [string map {key1 somekey1} $somedict]
somekey1 {black dict} key2 {white dict}
你会得到一个新的功能字典:

% set somedict [dict create key1 "black dict" key2 "white dict"]
key1 {black dict} key2 {white dict}
% dict get $somedict somekey1
black dict
(该值将短暂地成为字符串值,但当您对其使用字典操作时,它将恢复为字典值。)

但这有点危险:
字符串映射
会对找到的每个匹配进行替换,包括长字符串内部

如果您知道要按顺序更改哪个键,可以使用简单的列表转换:

% lset somedict 0 somekey1
somekey1 {black dict} key2 {white dict}
如果您不知道它在哪里,您可以搜索它(它最好在那里,否则
lset
尝试更改元素-1):

这很难看,但很简单

文件: , , ,

您可以利用这样一个事实:字典也是一个列表,它也是一个字符串

请注意,我通常会告诉您永远不要混合使用操作和清单类型(例如,永远不要在字符串上使用列表操作)。但就像音乐一样,在Tcl,只要你知道自己在做什么,任何规则都可能被打破。(除了十二条语法规则,这些规则是神圣不可侵犯的。)

鉴于这本词典:

% set somedict [dict create key1 "black dict" key2 "white dict"]
key1 {black dict} key2 {white dict}
% dict get $somedict somekey1
black dict
您可以执行字符串转换:

% set somedict [string map {key1 somekey1} $somedict]
somekey1 {black dict} key2 {white dict}
你会得到一个新的功能字典:

% set somedict [dict create key1 "black dict" key2 "white dict"]
key1 {black dict} key2 {white dict}
% dict get $somedict somekey1
black dict
(该值将短暂地成为字符串值,但当您对其使用字典操作时,它将恢复为字典值。)

但这有点危险:
字符串映射
会对找到的每个匹配进行替换,包括长字符串内部

如果您知道要按顺序更改哪个键,可以使用简单的列表转换:

% lset somedict 0 somekey1
somekey1 {black dict} key2 {white dict}
如果您不知道它在哪里,您可以搜索它(它最好在那里,否则
lset
尝试更改元素-1):

这很难看,但很简单

文件: , , ,

是否要将新记录添加到字典中?否。我只想重命名该键。是否要将新记录添加到字典中?否。我只想重命名该键。这也是我想做的,但我认为可能有更有效的方法。没有更有效的方法;它必须在基础表中创建一个新的哈希项。不过,在其他方面,移动数据的成本很低;条目的内容是通过引用传递的。请注意,目前所述的解决方案不起作用。这也是我想做的,但我认为可能有更有效的方法。没有更有效的方法;它必须在基础表中创建一个新的哈希项。不过,在其他方面,移动数据的成本很低;条目的内容是通过引用传递的。请注意,当前所述的解决方案不起作用。