python之字典

python中很重要的三个数据结构为元组,列表,字典,分别对应(),[]和{}表示。由于字典在数据存储方面功能十分强大,这里对dict即字典进行介绍。

  1. 基本构成

字典的基本组成单位为键值对,各个键值对用,分开,键与值用:分开。

a = {"beijing":2,"guangzhou":1}

1.1键

字典的键必须为可哈希的,集合set,列表list和字典dict就不适合作为键,因为这两种类型是可变的(在python中是因为该类对象成员函数__hash__返回为None),所有不可变的对象都是可哈希的,都可以作为字典的对象。但是各键值对之间的键不允许重复,即不允许一键对多值。但是如果重复了即键起冲突,字典在初始化时并不会报错,字典会按照后面覆盖前面对键赋值。具体请参考https://blog.csdn.net/lnotime/article/details/81192207

a = {(beijing):1,(beijing):2}
print(a)
输出则为
{(beijing):2}

根据键可以直接获取与其关联的值

例如:
a["beijing"] = 2
a["guangzhou"] = 1

1.2值

字典的值可以为任意类型,包括列表和字典。这样就可以实现对复杂关系型数据对描述,例如我想存储全国一年各个地区的天气。

Data_weather_2019 = {
"01-01":{"beijing":"sunny","shanghai":"rain",..."zhengzhou":"rain"},
"01-02":{"beijing":"cloudy","shanghai":"sunny",..."zhengzhou":"rain"},
...
"12-12":{"beijing":"cloudy","shanghai":"thunderstorm",..."zhengzhou":"rain"}}

这里的键是日期,值是当天日期全国各地主要城市的天气状况。当然该字典本身也可以作为另外一个字典的值,内部的值也可以进行嵌套,从而形成更加复杂的字典。同时键值对并要求类型完全相同,例如

{"beijing":1,"guangzhou":{"baiyun":1,"pazhou":0}}

也是合法的,这样的字典描述可以非常复杂的模型。为了节省存储空间和传输,可以对上述字典进行编码。例如"beijing'为010,"zhengzhou"为0371来编码,等到使用时再反过来解码就可以实现。当然具体编码解码有很多规则,这里不再展开。

      2.运算

2.1 组合

用两个字典构成新的字典

a = {"11":2,"33":4}
b = {"22":5}
c = {}
c.update(a)
c.update(b)
print(c)
输出结果为
{"11":2,"33":4,"22":5}

2.2 遍历

一般采用for循环对字典进行遍历

例如

a = {"bj":1,"gz":2,"sh":3}
利用
for key in a:
    print(key)
    print(a[key])
来对a遍历,key表示键,a[key]表示值
也可以用
for key,value in a.items():
    print(key)
    print(value)
效果同上,这里对value表示值。

2.3 判断字典是否为空

a = {}
if len(a) == 0:
    print("字典为空")
else:
    print("字典不为空")
或者使用
if not a:
    print("字典为空")
else:
    print("字典不为空")

python中[],(),{},"",False,0都为假

2.4 判断字典是否包含某键

字典的键可以用keys()来获得,只需要用in可以判断,例如

我想知道“beijing”是否在
a = {"beijing":1,"guangzhou":2}中就可以用
if "beijing" in a.keys():
    print("yes")
else:
    print("no")

python3中也可用__contains__来判断

2.5 判断某对象是否为字典

参考:https://www.cnblogs.com/jessicaxu/p/7727264.html

1,通过isinstance来判断:

isinstance(a,dict):如果a是字典则返回真(True),否则返回假(False)

2 ,通过type函数与已知类型比对

type(obj) == type({"beijing":1});如果obj是字典则返回真(True),否则返回假(False)

2.6 字典的初始化和合并

1可以采取直接赋值初始化
a_dict = {"monday":1,"tuesday":2}
2直接赋值
b_dict = a_dict
注意这里是浅拷贝,b_dict与a_dict都指向相同的地址,并没有新开辟一块内存空间。

两个字典如何合并构成新的字典呢?

在python2中可以采用
a_dict = {"a":1,"b":2}
b_dict = {"b":3,"c":4}
可以采用
c_dict = dict(a_dict.items()+b_dict.items())
可以得到
c_dict = {"c":4,"a":1,"b":3}
相同的键进行覆盖,并且新生成的字典是无序的。
但是在python3中,这种方法不能通过,可以采用update()来完成
c_dict = a_dict.update(b_dict)
但是这样得到的是None
主要是因为update更新采取的是直接在源字典上添加新的键值对,返回的结果是None
上述的操作是对a_dict添加了b_dict,并更新了a_dict,返回的结果就是None
只要执行c_dict = a_dict就可以得到相应的结果。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值