Tcl 在字典中的特定点插入新值

Tcl 在字典中的特定点插入新值,tcl,Tcl,我想在字典中插入一个新值,不是在末尾,而是在给定的位置,如linsert函数,保持字典的顺序对我来说很重要。 我的新值:dict set mydict ford wheels 4我的字典: set mydict {mercedes {wheels 4} opel {wheels 4}} 我想要这个结果:梅赛德斯{wheels 4}福特{wheels 4}欧宝{wheels 4} 而不是这个:梅赛德斯{wheels 4}欧宝{wheels 4}福特{wheels 4}字典维持的顺序是第一次插入;

我想在字典中插入一个新值,不是在末尾,而是在给定的位置,如
linsert
函数,保持字典的顺序对我来说很重要。
我的新值:
dict set mydict ford wheels 4

我的字典:

set mydict {mercedes {wheels 4} opel {wheels 4}}
我想要这个结果:
梅赛德斯{wheels 4}福特{wheels 4}欧宝{wheels 4}


而不是这个:
梅赛德斯{wheels 4}欧宝{wheels 4}福特{wheels 4}

字典维持的顺序是第一次插入;如果字典中没有键,它总是在末尾。(它必须去某个地方。)没有操作可以把它放在其他地方

但是你可以做一个!诀窍是要知道口述可以有效地“类型双关”到列表中。事实上,dict故意使用与列表相同的格式规则(受限于必须有偶数个元素,并且删除重复键的约束)。这意味着您可以使用
linsert
来完成棘手的部分(假设您使用的是数字索引,而不是
end
-相对索引)

proc dict_set_位于{dictionaryVar索引键值}{
upvar 1$YVAR d
如果{[dict exists$d$key]}{
dict设置d$键$值
}否则{
集合d[linsert$d[expr{$index*2}]$key$value]
}
返回$d
}
#演示代码
设置mydict{mercedes{wheels 4}欧宝{wheels 4}
在mydict 1 ford{wheels 4}的dict_set_
放入$mydict

#是什么阻止你使用
linsert
?说实话,我没有尝试……请尝试。TCL中的几乎所有东西都是一个字符串,例如,可以考虑列表和DICT,只是构造这些字符串的方便方法。这意味着,如果其中一个看起来像另一个,那么您在上使用的命令很可能也适用于另一个。在这里,可以说dict是一个特殊的列表;您当前的dict看起来像一个包含4个元素的列表,您需要在索引2处插入2个元素。好的,我想我找到了
linsert$mydict 2 ford{wheels 4}
,我想有一个更好的方法,比如
dict insert
,谢谢Jerry的解释dict不是从一开始就要排序的,它们毕竟只是一个存储结构。出于显示目的,如有必要,可以使用带有排序功能的
dict键
,以所需顺序打印dict键/值。因此,在特定位置插入没有任何意义。