TCL 语言的数据结构——字典

目录

一  字典(dict)的概念

二  字典(dict)的基本结构

三  字典(dict)的创建

四  字典(dict)的一些基本操作

4.1  查询:dict get

4.2  修改:dict set 和 dict replace

4.3  删除:dict unset 和 dict remove

4.4  融合:dict merge

五  检测字典(dict)的一些操作

六  字典(dict)的遍历

七  嵌套字典(dict)的使用


一  字典(dict)的概念

在 Tcl 语言中,字典 dict 是一种无序的 “ 键 - 值 对 集合,也被称为关联数组或者哈希表。它可以存储键值对,其中唯一的可以是任意 Tcl 数据类型字典可以通过键来访问对应的值,因此它非常适合存储和处理大量数据。

二  字典(dict)的基本结构

elem1 elem2 elem3 elem4 ...
元素以键值对的形式存在,有 key 必有 value 。 {键(key)   值(value)}

# 基本结构
{key1 value1 key2 value2 key3 value3 ...}

三  字典(dict)的创建

dict create 命令创建字典

# 基本结构
set my_dict [dict create key1 value1 key2 value2 key3 value3]
puts $my_dict
# 创建字典
set dict1 {} ;# 用花括号创建空字典
set dict2 [dict create] ;# 用dict create创建空字典
set dict3 [dict create Name "Tom" Age "18" Gender "male"] ;# 用dict create创建具有初始键值对的字典 
puts $dict1
puts $dict2
puts $dict3

 输出结果

四  字典(dict)的一些基本操作

4.1  查询:dict get

格式:dict get $dict key 
dict get 获取两个参数,一个字典和一个键,然后返回键对应的值:

# 创建一个字典
set dict [dict create name 张三 age 十岁 gender male]
# 获取键为name的值并打印
puts [dict get $dict name]

4.2  修改:dict set 和 dict replace

格式:dict set dict key newvalue    dict replace $dict key newvalue
dict set 获取三个参数,一个字典名称和键及键对应的新的值
dict replace 获取三个参数,一个字典和键及键对应的新的值
从语法上可以看出二者的行为是不同的前者直接更改了原始字典,后者则是产生一个新的字典,不会对原始字典做修改。实际上从下面的例子也能看出二者不同之处

# 创建一个字典
set mydict [dict create name 张三 age 十岁 gender male]
# 修改指定键的值
puts [dict set mydict name 李四]
puts [dict replace $mydict gender female]
# 获取键为name的值并打印
puts [dict get $mydict name]
# 获取键为gender的值并打印
puts [dict get $mydict gender]
# 将dict replace产生的新字典存储在变量newdict中
set newdict [dict replace $mydict gender female]
# 获取newdict中键为gender的值并打印
puts [dict get $newdict gender]

4.3  删除:dict unset 和 dict remove

格式:dict unset dict key    dict remove $dict key
dict unset 获取两个参数,一个字典名称和键,删除键值对。
dict remove 获取两个参数,一个字典和键,删除键值对。
与上述 dict set 和 dict replace 一样,dict remove 不会改变原始的字典。

# 创建一个字典
set mydict [dict create name 张三 age 十岁 gender male]
# 删除指定键的键值对
puts [dict unset mydict name]
puts [dict remove $mydict age]
# 获取age对应的值
puts [dict get $mydict age]
# 获取name对应的值
puts [dict get $mydict name]

从输出结果看到即使我们用 dict remove 删除了字典中的 age 键值对,但是仍然能够获取到原始字典中 age 键对应的值,所以输出了 十岁

仔细思考原因可知,因为 dict set 和 dict unset 命令引用的是字典名称,换句换说改变了变量的名称;而 dict replace 和 dict remove 命令是通过美元符合加字典名称引用的,换句话说是变量的值。所以前者导致原始字典发生了改变,后者则是创建了一个新的字典副本,而不会影响到原始字典。这就导致使用 dict get 命令访问原始字典中的键值时出现了上述情况。

4.4  融合:dict merge

格式:dict merge $dict1 $dict2 ...
dict merge 通过融合两个或更多字典,创建一个新字典。当执行该命令时,该命令会先创建一个新的空字典,然后依次将各个字典中的键值对添加到新字典中。对于存在相同键的情况,新字典中的对应值会由最后一个出现的字典中的值决定。下面是一个示例:

set dict1 {a 1 b 2 c 3}
set dict2 {b 4 c 8 d 5}
set dict3 {c 6 e 7}
set newDict [dict merge $dict1 $dict2 $dict3]
puts [dict get $newDict a] ;# 输出1
puts [dict get $newDict b] ;# 输出4
puts [dict get $newDict c] ;# 输出6
puts [dict get $newDict d] ;# 输出5
puts [dict get $newDict e] ;# 输出7

五  检测字典(dict)的一些操作

一旦有了一个字典,就可以执行很多操作来检测它。

检测字典的常规命令
命令解释
dict size检测字典中键值对的个数
dict exists检测 key 是否存在字典中
dict keys返回包含 key 的列表(按顺序)
dict value返回包含value的列表(按顺序)
# 创建一个空字典
set example [dict create]
# 检测键值对个数并输出
puts [dict size $example]
# 通过dict set命令往字典中添加新的键值对
dict set example name 萧炎 
dict set example sex male 
dict set example age 20
# 打印添加元素后的字典以及键值对个数
puts $example
puts [dict size $example]
# 查看字典中name键是否存在
puts [dict exists $example name] ;#有则返回1
puts [dict exists $example height] ;#无则返回0
# 返回包含key的列表
puts [dict keys $example]
# 还可以与指定模式的string match匹配情况进行筛选
puts [dict keys $example {*e}]
# 返回包含value的列表
puts [dict value $example] ;#同样也可以进行模式筛选

六  字典(dict)的遍历

要遍历字典的键值对,并对它们进行一些操作,可以使用 dict for 命令。它获取三个参数:一对变量的列表作为第一个参数,并获取一个字典以及构成循环体的 Tc l脚本。

# 语法规则:
dict for {key value} $dictname {
    # 循环体
}
# 创建字典
set Dcit {a 1 b 2 c 3 d 8 e 20}
# 遍历字典
dict for {key value} $Dcit {
    # 输出键值对
    puts "Key: $key, Value: $value"
    # 判断是当前值是否为偶数,是则将对应的键的值平方
    if {$value % 2 == 0} {
        dict set Dcit $key [expr {$value ** 2}]
    }
}
# 输出更改后的字典
puts $Dcit

七  嵌套字典(dict)的使用

在 Tcl 中,嵌套字典是指在一个字典中存储另一个字典,常用于存储具有复杂结构的数据,例如树形结构、层次结构数据。
例如我们可以用嵌套字典来存储快递清单:

# 这里面加双引号的目的是为了让程序正确的识别中文字符
set expressDict {
    "快递A" {
        "快递单号" "56423"
        "收件人" "张三"
        "联系方式" "13245896589"
        "地址" "xx省xx市xx街道"
    }
    "快递B" {
        "快递单号" "89456"
        "收件人" "李四"
        "联系方式" "13287951234"
        "地址" "yy省yy市yy街道"
    }
}
# 获取快递B的收件人和快递A地址信息
set recipient [dict get [dict get $expressDict "快递B"] "收件人"]
set address [dict get [dict get $expressDict "快递A"] "地址"]
puts $recipient
puts $address

最后,dict 相关的命令还有 dict append dict lappend dict incrdict update、 dict with 用来更新字典中的值,以及为嵌套字典所使用的。

  • 30
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值