IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python创建dict的方法及坑 -> 正文阅读

[Python知识库]python创建dict的方法及坑

说到在python中创建dict,我们很自然的就想到用mydict = {},然后对其赋值。

mydict = {}
mydict['a'] = 123
mydict['b'] = 'ping'
mydict['c'] = [1,2,3]

mydict
Out[12]: {'a': 123, 'b': 'ping', 'c': [1, 2, 3]}

但是当我们想免于一个一个手动添加的时候,坑就来了

1. dict.fromkeys

对于已知key来创建dict,dict.fromkeys其实是个好东西。
但是看下面两个例子:

dict1 = dict.fromkeys(('a','b','c'),[])
dict1['a'] = ['mm']
print(dict1)
dict2 = dict.fromkeys(('a','b','c'),[])
dict2['a'].append('mm')
print(dict2)
{'a': ['mm'], 'b': [], 'c': []} # dict1
{'a': ['mm'], 'b': ['mm'], 'c': ['mm']} # dict2

看到了吧,如果直接用等于号赋值,那么只会对对应位置的值进行修改,而用append对内容进行添加时却会对所有的value都进行修改。
这个问题的原因显而易见,当我们用dict.fromkeys创建dict时,传入的第二个参数 [ ] 被所有keys使用,即每个key指向的value是同一个地址。并不是将[ ] 复制了3份,而是一份[ ] 被所有key指向使用。

所以如果我们用等于号赋值的方法,相当于把 a 的这个指针指向了一块儿新的区域,而对bc没有影响。可是如果对a进行append,那么其实修改的是abc共同拥有的那块儿value,所以bc的值也会跟着变。

那么我们又想用这种方法,又想不让bc的值跟着a变该怎么办呢?
首先确定的是,得用等于号。其次,不能改变原有的那块儿公共value区域,所以:

dict3=dict.fromkeys(('a','b','c'),[])
dict3['a'] = dict3['a']+['55']
print(dict3)
{'a': ['55'], 'b': [], 'c': []}

哎嗨,这就成了。
但还会想我如果用copy.deepcopy一类的呢?我把新的value赋值给了a啊,那我们瞅瞅:

dict4=dict.fromkeys(('a','b','c'),[])
dict4['a']=copy.deepcopy(dict4['a'].append('66'))
print(dict4)
{'a': None, 'b': ['66'], 'c': ['66']}

看到了吧,是把a先append以后再copy的啊,所以公共区域value是已经被改变了。

2.字典键值元组表

还有一种通过key-value的元组表来创建dict

dict5=dict([('name','Allen'),('age',21),('gender','male')])
print(dict5)
{'gender': 'male', 'age': 21, 'name': 'Allen'}

这个没问题哈,妥妥儿的。
但是我们要看的情况是,如果value是个list,并且我想动态生成怎么办。
举个例子:我想根据id中的前四位字母把他们分到对应的key下

ids = ['1233000004567', '1256000004532', '1233000001101', '1256000000099']

按照我们的想法,结果应该是

{'1233':['1233000004567','1233000001101'], '1256':['1256000004532', '1256000000099']}

但如果我用元组表来创建:

lis = []
for id in ids:
	lis.append((id[:4],id))
dict6 = dict(lis)
print(lis)
print(dict6)

lis
Out[47]: 
[('1233', '1233000004567'),
 ('1256', '1256000004532'),
 ('1233', '1233000001101'),
 ('1256', '1256000000099')]
dict6
Out[48]: {'1233': '1233000001101', '1256': '1256000000099'}

瞧瞧,又被覆盖了。所以对于要动态增加的情况,不能用元组表来生成dict。

暂时先写到这儿 该睡了嘎嘎

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:18:55  更:2022-03-16 22:20:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 19:53:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码