在特定点在字典中插入新值
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
有效。但它确实有效。
我想在我的字典中插入一个新值,不是在末尾,而是在给定的位置,例如 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
有效。但它确实有效。