python字典教学_Python字典及基本操作(超级详细)

今天小张帮大家简单介绍下Python的一种数据结构: 字典,字典是 Python 提供的一种常用的数据结构,它用于存放具有映射关系的数据。

比如有份成绩表数据,语文:79,数学:80,英语:92,这组数据看上去像两个列表,但这两个列表的元素之间有一定的关联关系。如果单纯使用两个列表来保存这组数据,则无法记录两组数据之间的关联关系。

为了保存具有映射关系的数据,Python 提供了字典,字典相当于保存了两组数据,其中一组数据是关键数据,被称为 key;另一组数据可通过 key 来访问,被称为 value。形象地看,字典中 key 和 value 的关联关系如图 1 所示:

由于字典中的 key 是非常关键的数据,而且程序需要通过 key 来访问 value,因此字典中的 key 不允许重复。

一.介绍

1.定义

dict(字典),以{}表示,每一项用逗号隔开, 内部元素用key:value的形式来保存数据,例如

{"jj":"林俊杰", "jay":"周杰伦"}

2.原理

查询的效率非常高, 通过 key 来查找元素

内部使用 key 来计算一个内存地址,采用 hash 算法,并且 key 必须是不可变的数据类型(即为可哈希的数据类型)

dict 保存的数据不是按照我们添加进去的顺序保存的. 是按照 hash 表的顺序保存的.而 hash 表不是连续的. 所以没有索引,不能进行切片工作. 它只能通过 key 来获取 dict 中的数据.

dic = {} # 空字典

dic['徐峥'] = "人在囧途" #直接用key往里面存数据即可

print(dic["徐峥"]) # 最好别这么写,写成 print(dic.get("徐铮")),此时假入没有徐铮,程序也不会报错,会返回None

在这里顺便说下可哈希----可哈希就是不可变

已知的可哈希(不可变)的数据类型: int, str, tuple, bool

不可哈希(可变)的数据类型: list, dict, set 集合 此三类不能作为 key

二.字典的增、删、改、查

1. 字典的新增:

dic[新key] = "value" # 如果k存在,会替换原来的value

dic.setdefault("key","value") # 如果key存在,跳过,不存在,则添加

2. 删除

1.pop(key) #根据key删除

有返回值,可以写成

value=dic.pop(key)

print(value) # 打印删除的值,但是print(dic) 是整个键值对

2.popitem() # 不写 key 随机删除,(2.x是随机的删除,3.x是删除最后一个字典)

3.clear() # 清空

4.del dic[key] # 按照key删除

3. 修改

dic[key] = 新值 # key 为原来的

update() dic1.update(dic2) # 将字典2的内容放到1中,如果key1中存在,直接修改value,不存在的话附加到字典1 上

4. 查询

dic = {"徐锦江":"倩女幽魂","苏有朋":"倚天屠龙记"}

1. 用key直接查询

print(dic["徐锦江"]) #注意,key不存在会报错,此时可以用get,get有返回值

2. dic.get(key) #没有key返回None

print(dic.get("苏有朋")) # 倚天屠龙记

3. setdefault()

print(dic.setdefault("徐锦江")) #倩女幽魂

5. 其他操作

5.1 get 常用方法

dic={}

print(dic.get("name")) #None

print(dic.get("name","张三")) #张三(如果获取为None时,可以自定义默认值)

print(dic) #{}

dic2={"name":"李四"}

print(dic2.get("name","张三")) #李四(获取非None时,自定义值不起作用)

5.2 keys()、 values()、 items()的用法

例子:

dic = {"汪峰": "大陆音乐半壁江山", "周杰伦": "亚洲音乐天王", "罗志祥": "亚洲舞王"}

print( dic.keys())

print(dic.values())

print(dic.items())

结果如下:

dict_keys(['汪峰', '周杰伦', '罗志祥'])

dict_values(['大陆音乐半壁江山', '亚洲音乐天王', '亚洲舞王'])

dict_items([('汪峰', '大陆音乐半壁江山'), ('周杰伦', '亚洲音乐天王'), ('罗志祥', '亚洲舞王')])

可执行 这个返回的不是列表, 很像列表,一般不这么用,而是如下操作

keys() 获取所有键

for el in dic:

print(el) # 直接拿到key value需要字典查一下

print(dic[el])

#两者用法一样

for key in dic.keys():

print(key) # 取出key

print(dic[key]) # 取出 value

values()获取所有的值

for value in dic.values():

print(value) #取出value

items() 获取所有的键值对. 返回的是元组

for item in dic.items():

print(item)

#结果

('汪峰', '大陆音乐半壁江山')

('周杰伦', '亚洲音乐天王')

('罗志祥', '亚洲舞王')

#如果都想拿到 根据解构的思路可以改写成

for k,v in dic.items():

print(k) # 取出key 汪峰

print(v) # 取出values 大陆音乐半壁江山

print(k,v) # 在一排显示 汪峰 大陆音乐半壁江山

5.3 fromkeys 是一个类方法.作用是创建新字典

fromkeys 是一个类方法.作用是创建新字典例

例子1:

d = {}

dd = d.fromkeys(["胡辣汤","are you 确定?"], "周芷若")

print(d) # 原字典没有改变 {}

print(dd) # 新的字典是通过第一个参数的迭代. 和第二个参数组合成key:value创建新字典 {'胡辣汤': '周芷若', 'are you 确定?': '周芷若'}

例子2:

d = dict.fromkeys(["哇哈哈", "爽歪歪"], []) # 所有的key用的都是同一个列表,改变其中一个。另一个也跟着改变

d["哇哈哈"].append("张无忌")

print(d) # {'哇哈哈': ['张无忌'], '爽歪歪': ['张无忌']}

三 小技巧,骚操作

1.合并字典。

方法 1 : 使用 update() 方法,第二个参数合并第一个参数

def Merge(dict1, dict2):

return(dict2.update(dict1))

# 两个字典

dict1 = {'a': 10, 'b': 8}

dict2 = {'d': 6, 'c': 4}

# 返回 None

print(Merge(dict1, dict2))

# dict2 合并了 dict1

print(dict2)

执行以上代码输出结果为:

None

{'d': 6, 'c': 4, 'a': 10, 'b': 8}

方法 2 : 使用 **,函数将参数以字典的形式导入

def Merge(dict1, dict2):

res = {**dict1, **dict2}

return res

# 两个字典

dict1 = {'a': 10, 'b': 8}

dict2 = {'d': 6, 'c': 4}

dict3 = Merge(dict1, dict2)

print(dict3)

执行以上代码输出结果为:

{'a': 10, 'b': 8, 'd': 6, 'c': 4}

2.列表内字典去重

列表的内的元素类型为字符串或这 int 类型的,借助集合 set,会很方便的去重,但是如果元素 dict,此时利用 set 去重将会报错TypeError: unhashable type: 'dict',以下介绍一个简单的方法,利用 reduce 简单说下 reduce reduce() 函数会对参数序列中元素进行累积。函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

语法: reduce(function, iterable[, initializer])

参数 function -- 函数,有两个参数 iterable -- 可迭代对象 initializer -- 可选,初始参数

返回值 返回函数计算结果 具体代码如下:

from functools import reduce

def list_dict_duplicate_removal():

data_list = [{"a": "123", "b": "321"}, {"a": "123", "b": "321"}, {"b": "321", "a": "123"},{"d":12,"sdf":2312}]

run_function = lambda x, y: x if y in x else x + [y]

return reduce(run_function, [[], ] + data_list)

if __name__ == '__main__':

print (list_dict_duplicate_removal())

#结果如下

[{'a': '123', 'b': '321'}, {'d': 12, 'sdf': 2312}]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值