Dict命令的学习

Dict命令的学习

语法:

dict option arg ? arg ... ?

描述:

根据选项,对字典值或包含字典值的变量执行几种操作中的一种(请参阅下面的字典值部分以获得描述)。法律选项(可能缩写)有:

dict append

 dict append dictionaryVariable key ? string ...?

这将给定字符串(或多个字符串)附加到给定键映射到给定变量中包含的字典值中的值,并将结果字典值写回该变量。不存在的键被视为映射到空字符串。返回更新后的字典值。

el: 对某个 key-value 中的 value 添加字符串

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    pathon

dict append dict1 Monday son Monday son

dict for {key value} $dict1 {
    puts "$key -> $value"
}
# 结果:
# Monday -> jacksonMondayson

dict create

dict create ?key value ...?

返回一个新字典,其中包含作为参数列出的每个键/值映射(键和值交替,每个键后跟与其关联的值)。

el: 创建一个字典

# 方式一:
dict for {key value} [dict create Monday jack Tuesday mary] {
    puts "$key -> $value"
}
# 方式二:
set dict1 [dict create Monday jack Tuesday mary]
dict for {key value} $dict1 {
    puts "$key -> $value"
}
# 结果:
# Monday -> jack
# Tuesday -> mary

dict exists

dict exists dictionaryValue key ? key ...?

这将返回一个布尔值,该值指示给定的键(或通过一组嵌套字典的键路径)是否存在于给定的字典值中。当dict在该路径上执行成功时,将返回一个真值。

el: 判断字典中是否存在这个 key

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    pathon

puts [dict exists $dict1 Wednesday]
puts [dict exists $dict1 Wednesday 2]
puts [dict exists $dict1 2]
# 结果:
# 1
# 0
# 0

dict filter

dict filter dictionaryValue filterType arg ?arg ...?

它接受一个字典值并返回一个新字典,其中只包含与指定过滤器类型(可以缩写)匹配的键/值对。支持的过滤器类型有:

dict filter dictionaryValue key ?globPattern …?

键规则只匹配那些键匹配任何给定模式的键/值对(以字符串匹配的样式)。

el:过滤出在 key 中符合 globpattern的 key-value; globpattern 和 string match 的方式一样

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    pathon

puts [dict filter $dict1 key "M*"]
# 结果:
# Monday jack

dict filter dictionaryValue script { keyVariable valueVariable } script

通过将键赋值给变量keyName,值赋值给变量valueName,根据srcipt脚本的布尔值结果来确定键值对是否匹配。当脚本结果为true时,表示键值对匹配。字典按键值对的插入顺序进行遍历。当在srcipt执行过程中遇到break时,会中止循环,结束dict filter命令。当遇到continue命令时,会结束本轮循环。

el:过滤

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    pathon

dict filter $dict1 script {key value} {
    puts "$key $value"
    regexp ".*" $value
}
# 结果:
# Monday jack
# Tuesday mary
# Wednesday son
# Thursday json
# Friday tcl
# Saturday java
# Sunday pathon

dict filter dictionaryValue value ?globPattern …?

值规则只匹配那些值匹配任何给定模式的键/值对(以字符串匹配的样式)。

el:过滤出在 value 中符合 globpattern的 key-value; globpattern 和 string match 的方式一样

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    pathon

puts [dict filter $dict1 value "j*"]
# 结果:
# Monday jack Thursday json Saturday java

dict for

dict for {keyVariable valueVariable} dictionaryValue body

该命令接受三个参数,第一个是包含两个元素的变量名列表(分别用于字典中每个映射的键和值),第二个是要遍历的字典值,第三个是要对键和值变量进行适当设置的每个映射求值的脚本(以foreach的方式)。该命令的结果是一个空字符串。如果对主体的任何求值产生TCL_BREAK结果,则不会对字典中的其他对进行迭代,并且dict for命令将立即成功终止。如果对函数体的任何求值产生TCL_CONTINUE结果,则应将其与正常的TCL_OK结果完全相同。迭代顺序是键被插入字典的顺序。

el:遍历字典中的元素

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    pathon

dict for {key value} $dict1 {
    puts "$key -> $value"
}
# 结果:
# Monday jack
# Tuesday mary
# Wednesday son
# Thursday json
# Friday tcl
# Saturday java
# Sunday pathon

dict get

dict get dictionaryValue ?key ...?

给定一个字典值(第一个参数)和一个键(第二个参数),这将检索该键的值。如果提供了多个键,则该命令的行为应该与**dict get \$dictVal \$key**的结果作为**dict get**的第一个参数传递给dict get,其余参数作为第二个(可能是后续)参数传递给dict get一样。这有助于在嵌套字典中查找。例如,下面两个命令是等价的:

dict get $dict foo bar spong
dict get [dict get [dict get $dict foo] bar] spong

如果没有提供键,dict get将以类似于array get的方式返回一个包含元素对的列表。也就是说,每对的第一个元素是键,第二个元素是键的值。

试图检索字典中不存在的键的值是错误的。

el:获取某个 key-value 中的key的值

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    pathon

puts [dict get $dict1 Monday]
# 结果:
# jack

dict info

dict info dictionaryValue

这将返回关于给定字典的信息(用于显示给人们),尽管该数据的格式依赖于字典的实现。对于由哈希表实现的字典,预计这将返回由Tcl HashStats生成的字符串,类似于数组统计( [array statistics](https://tcl.tk/man/tcl8.6/TclCmd/array.htm))。

el:显示dict的信息

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    pathon

puts [dict info $dict1]
# 结果:
# 7 entries in table, 4 buckets
# number of buckets with 0 entries: 1
# number of buckets with 1 entries: 1
# number of buckets with 2 entries: 1
# number of buckets with 3 entries: 0
# number of buckets with 4 entries: 1
# number of buckets with 5 entries: 0
# number of buckets with 6 entries: 0
# number of buckets with 7 entries: 0
# number of buckets with 8 entries: 0
# number of buckets with 9 entries: 0
# number of buckets with 10 or more entries: 0
# average search distance for entry: 2.0

dict keys

dict keys dictionaryValue ?globPattern?

返回给定字典值中所有键的列表。如果提供了模式,则只返回与之匹配的键(根据字符串匹配规则)。返回的键将按照它们插入字典的顺序排列。

el:返回所有的 key 或者符合 globPattern 的key

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    pathon

puts [dict key $dict1]
puts [dict key $dict1 "M*"]
# 结果:
# Monday Tuesday Wednesday Thursday Friday Saturday Sunday
# Monday

dict lappend

dict lappend dictionaryVariable key ?value ...?

这将把给定项附加到给定键映射到给定变量中包含的字典值的列表值中,并将结果字典值写回该变量。不存在的键被视为映射到空列表,并且没有项可以添加到列表中是合法的。如果键映射到的值不能以列表的形式表示,则会产生错误。返回更新后的字典值。

el:字典中添加key-value

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    pathon

dict lappend dict1 1 2
dict lappend dict1 Sunday 3
dict lappend dict1  4
dict lappend dict1 5 


dict for {key value} $dict1 {
    puts "$key -> $value"
}
# 结果:
# Monday -> jack
# Tuesday -> mary
# Wednesday -> son
# Thursday -> json
# Friday -> tcl
# Saturday -> java
# Sunday -> pathon 3
# 1 -> 2
# 4 -> 
# 5 -> 

dict map

dict map {keyVariable valueVariable} dictionaryValue body

该命令对字典的每个元素应用转换,返回一个新字典。它接受三个参数:第一个是包含变量名的双元素列表(分别用于字典中每个映射的键和值),第二个是要遍历的字典值,第三个是要为每个映射计算的脚本,其中键和值变量设置适当(以lmap的方式)。在被评估的脚本正常完成的迭代中(TCL_OK,而不是错误等),脚本的结果将使用键(即keyVariable变量在该点的当前内容)放入累加器字典中。dict map命令的结果是遍历所有键后的累加器字典。    如果对任何特定步骤的主体求值产生中断,则不再迭代字典中的其他对,dict map命令将立即成功终止。如果对特定步骤的体求值产生continue结果,则终止当前迭代并且不修改累加器字典。迭代顺序是字典的自然顺序(通常是键被添加到字典中的顺序;顺序与dict中for的顺序相同。

el:执行body中的命令,对字典dictValue中的键值进行转换,然后返回一个新的包含转换后的键值对的字典。

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    pathon

set newdict [dict map {key value} $dict1 {
    puts "$key -> $value"
    set key $key"1"
    set value $value"2"
}]

dict for {key value} $newdict {
    puts "$key -> $value"
}
# 结果:
# Monday -> jack
# Tuesday -> mary
# Wednesday -> son
# Thursday -> json
# Friday -> tcl
# Saturday -> java
# Sunday -> pathon

# Monday"1" -> jack"2"
# Tuesday"1" -> mary"2"
# Wednesday"1" -> son"2"
# Thursday"1" -> json"2"
# Friday"1" -> tcl"2"
# Saturday"1" -> java"2"
# Sunday"1" -> pathon"2"

dict merge

dict merge ?dictionaryValue ...?

返回一个包含每个 dictionaryValue 参数内容的字典。如果两个(或更多)字典包含同一键的映射,则生成的字典根据命令行上包含该键映射的最后一个字典将该键映射到值。

el:组合字典

dict set dict1 Monday    jack
dict set dict1 Wednesday son
dict set dict2 Tuesday   mary
dict set dict3 Tuesday   mary1

dict for {key value} [dict merge $dict1 $dict2 $dict3] {
    puts "$key -> $value"
}

# 结果:
# Monday -> jack
# Wednesday -> son
# Tuesday -> mary1

dict remove

dict remove dictionaryValue ?key ...?

返回一个新字典,它是作为第一个参数传入的旧字典的副本,除非列出的每个键没有映射。没有要删除的键是合法的,任何要删除的键在输入字典中不存在也是合法的。

el:删除字典中为 key 的元素,并返回一个新的字典

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    paython

dict for {key value} [dict remove $dict1 Sunday 2] {
    puts "$key -> $value"
}

# 结果:
# Monday -> jack
# Tuesday -> mary
# Wednesday -> son
# Thursday -> json
# Friday -> tcl
# Saturday -> java

dict replace

dict replace dictionaryValue ?key value ...?

返回一个新字典,它是作为第一个参数传入的旧字典的副本,除了一些不同的值或添加了一些额外的键/值对。在没有键/值对的情况下调用这个命令是合法的,但是在没有值的情况下调用这个命令是非法的。

el:替换字典中key的value,或者添加key-value,并返回一个新的字典

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    paython

dict for {key value} [dict replace $dict1 Sunday 2 1 2] {
    puts "$key -> $value"
}

# 结果:
# Monday -> jack
# Tuesday -> mary
# Wednesday -> son
# Thursday -> json
# Friday -> tcl
# Saturday -> java
# Sunday -> 2
# 1 -> 2

dict size

dict size dictionaryValue

返回给定字典值中键/值映射的个数。

el:返回字典中key-value的数量

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    paython

puts [dict size $dict1]

# 结果:
# 7

dict unset

dict unset dictionaryVariable key ?key ...?

此操作(**dict set**的同伴)接受包含字典值的变量的名称,并将更新后的字典值放入该变量中,该变量不包含给定键的映射。在存在多个键的情况下,它描述了通过嵌套字典到要删除的映射的路径。必须至少指定一个键,但键路径上的最后一个键不需要存在。路径上的所有其他组件必须存在。返回更新后的字典值。

el:删除key-value,不能有不存在的key

# 一个 key
dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    paython

dict for {key value} [dict unset dict1 Sunday] {
    puts "$key -> $value"
}
# 结果:
# Monday -> jack
# Tuesday -> mary
# Wednesday -> son
# Thursday -> json
# Friday -> tcl
# Saturday -> java
# 多个 key
dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    {Saturday 1 Friday 2}

dict for {key value} [dict unset dict1 Sunday Saturday] {
    puts "$key -> $value"
}
# 结果:
# Monday -> jack
# Tuesday -> mary
# Wednesday -> son
# Thursday -> json
# Friday -> tcl
# Saturday -> java
# Sunday -> Friday 2

dict update

dict update dictionaryVariable key varName ?key varName ...? body

执行Tcl脚本主体,将每个键的值(通过读取dictionaryVariable中的字典值找到)映射到变量varName。可能有多个key/varName对。如果键没有映射,则对应于未设置的varName。当body终止时,**对varNames所做的任何更改都会反映回dictionaryVariable中的字典**(除非dictionaryVariable本身变得不可读,此时所有更新都被静默地丢弃),即使body的结果是错误或其他类型的异常退出。字典更新的结果(除非发生某种错误)是body求值的结果。

每个varName都映射到包含字典更新的作用域中;建议仅在局部范围(过程、apply的lambda术语或方法)中使用此命令。因此,dict update设置的变量将在命令结束后继续存在(除非显式取消设置)。注意,值到变量的映射不使用跟踪;对dictionaryVariable内容的更改仅在body终止时发生。

el:更新key的value,key不能是不存在于字典中

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    pathon


dict update dict1 Sunday value Saturday value2 {
    if {$value == "pathon"} {
        set value 1
    }
    if {$value2 == "java"} {
        puts $value2
    }
}

dict for {key value} $dict1 {
    puts "$key -> $value"
}

# 结果:
# java
# Monday -> jack
# Tuesday -> mary
# Wednesday -> son
# Thursday -> json
# Friday -> tcl
# Saturday -> java
# Sunday -> 1

dict values

dict values dictionaryValue ?globPattern?

返回给定字典值中所有值的列表。如果提供了模式,则只返回与之匹配的值(根据字符串匹配规则)。返回值将按照与这些值相关联的键插入字典的顺序排列。

el:与 dict key相同

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  json
dict set dict1 Friday    tcl
dict set dict1 Saturday  java
dict set dict1 Sunday    pathon

puts [dict values $dict1 "s*"] 


# 结果:
# son

dict with

dict with dictionaryVariable ?key ...? body

在body中执行Tcl脚本,将dictionaryVariable中每个键的值映射(以类似于dict更新的方式)到具有相同名称的变量。当有一个或多个键可用时,这些键表示一个嵌套字典链,其中最里面的字典是为执行body打开的字典。与字典更新一样,使dictionaryVariable不可读将使对字典的更新被丢弃,如果调整dictionaryVariable的内容使字典链不再存在,也会发生这种情况。dict with的结果(除非发生某种错误)是body求值的结果。

将变量映射到包含字典的作用域中;建议仅在局部范围(过程、apply的lambda术语或方法)中使用此命令。因此,dict设置的变量将在命令结束后继续存在(除非显式取消设置)。注意,值到变量的映射不使用跟踪;对dictionaryVariable内容的更改仅在body终止时发生。

如果在主体终止时,dictionaryVariable包含的值不是字典(如果名称与字典中的任何键相同,则很容易发生这种情况),则会在该点发生错误。因此,当字典中的键可能与dictionaryVariable名称本身冲突时,不建议使用此命令。如果包含的键确实映射到字典,则最终效果是将内部字典合并到外部字典中;请看下面的例子来说明这一点。

el:在字典中进行多个 key-value 的操作

dict set dict1 Monday    jack
dict set dict1 Tuesday   mary
dict set dict1 Wednesday son
dict set dict1 Thursday  {json1 yes}

dict with dict1 {
    set Monday "java"
    set Tuesday "tcl"
    set Wednesday "python"
    set Friday "go"
}

dict with dict1 Thursday {
    set json1  no
}

puts [dict get $dict1 Monday]
puts [dict get $dict1 Thursday]

# 结果:
# jack
# json1 no
# Monday -> java
# Tuesday -> tcl
# Wednesday -> python
# Thursday -> json1 no

DICTIONARY VALUES

字典是包含从任意键到任意值的有效的、保持顺序的映射的值。字典中的每个键映射到单个值。它们的文本格式与任何具有偶数个元素的列表的格式完全相同,字典中的每个映射都表示为列表中的两个项目。当一个命令接受一个字典并基于它生成一个新字典时(要么返回它,要么将它写回到读取起始字典的变量中),新字典将具有相同的键顺序,对任何已删除的键取模,并在末尾添加新键。当字符串被解释为字典并且它可能有重复的键时,只使用特定键的最后一个值;其他的被忽略,这意味着“apple banana”和“apple carrot apple banana”是等价的字典(具有不同的字符串表示)。

从旧字典派生新字典的操作(例如,像dict set和dict unset这样的更新)保留了字典中键的顺序。例外情况是他们添加的任何新键(附加到序列中)和删除的任何键(从顺序中删除)。
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值