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

Insert new value in Dictionary at specific point

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

set mydict {mercedes {wheels 4} opel {wheels 4}}

我想要这样的结果:mercedes {wheels 4} ford {wheels 4} opel {wheels 4}
而不是这个:mercedes {wheels 4} opel {wheels 4} ford {wheels 4}

字典维护的顺序是第一个插入的顺序;如果键不在字典中,它总是在最后。 (它必须去到一个一致的地方。)没有把它放在别处的操作。

但你可以做一个!诀窍是知道字典可以有效地“打字”成列表。实际上,dicts 故意具有与列表相同的格式规则(受必须有偶数个元素的约束,并且重复的键被删除)。这意味着您可以使用 linsert 来完成棘手的操作(假设您使用数字索引而不是 end-相对索引)。

proc dict_set_at {dictionaryVar index key value} {
    upvar 1 $dictionaryVar d
    if {[dict exists $d $key]} {
        dict set d $key $value
    } else {
        set d [linsert $d [expr {$index * 2}] $key $value]
    }
    return $d
}

# Demo code
set mydict {mercedes {wheels 4} opel {wheels 4}}
dict_set_at mydict 1 ford {wheels 4}
puts $mydict
#  mercedes {wheels 4} ford {wheels 4} opel {wheels 4}

一个关键的警告:这不如普通的旧 dict set 有效。但它确实有效。