梦想最大的意义,并不在于,你最终是否去实现了它。而是它赐予你信心,带给你希望,给予你力量。不是现实支撑了你的梦想,而是你的梦想支撑了现实。
用好字典的关键在于Key(set)
字典不会用,基本就不会编程,字典非常重要;
可变类型与不可变类型
可变类型:值可以改变:
列表list
字典dict
不可变类型:值不可以改变:
数值类型int, long, bool, float
字符串str
元组tuple
字典
总结:
- Python3中,字典keys\values\items 方法返回一个类似一个生成器的可迭代对象;不会把函数的返回结果复制到内存中;不会产生内存copy,节省内存空间;
d={}
type(d.items()) # dict_items([])- Python2中,上面的方法返回一个新的列表,占据新的内存空间,所以Python2建议使用iterkeys、
3.用好字典的关键在于Key
1.字典中的元素访问--三种方式
字典的key
1.key的要求和set的元素要求一致;
2.set的元素可以看做key,set可以看做dict的简化版;
3.hashable 可哈希才可以作为key, 可以使用hash() 测试;
- d[key]
key不存在返回KeyError ;- get(key[,default])
key不存在返回缺省值,没有设置返回缺省值;- setdefault(key[,default])
key不存在,添加KV对,value为default,没有设置返回缺省值;
2.访问字典
# 返回一个键的列表
dict1.keys()
['name','age']
# 返回一个值的列表
dict1.values()
['linda',13]
# 返回一个包含(键,值)元组的列表
dict1.items()
[('name','linda'),('age':13)]
# 返回键name对应的值
dict1['name']
'linda'
# 得到键的值,若键不存在,则返回默认值
dict1.get('name',None)
'linda'
# 字典中没有sex,返回默认值man
dict1.get('sex','man')
'man'
dict.iter() #方法 iteritems(), iterkeys(), itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表。
2.字典的删除;
- pop(key[key,default])**
key 存在,移除它,返回它的value;
key不存在返回default ;
default未设置,Key不存在则抛出KeyError异常;- popitem() 随机删除,没有任何文档表示它的删除有规律
返回要移除的 一个任意的键值对;
字典为empty,抛出KeyError 异常;- clear()
清空字典
2.1 字典循环移除元素——移除字典中值为字符串的一项
2.1 字典元素的删除操作——del、pop
2.2 循环内增加、删除value时不允许的;pop会在循环内报错;但单独增删key ;
正确的做法:字典元素的删除——删除key;
keys = []
#直接增删是不允许的,因为 dict 长度是不允许改变的;
for k in d2.keys():
if k % 2:
keys.append(k)
正确的做法:字典元素的删除——删除key;
for k in keys:
d2.pop(k)
---------------------------------------
for k in d.keys():
print(k)
if isinstance(d[k],str):
lst.append(k)
d.pop(lst[0])
d
总结:
1.循环内增加、删除value时不允许的;pop会在循环内报错;
2. del a['c'] 看着像删除了一个对象,本质上是减少了一个对象的引用,del 实际上删除的是名称,而不是对象;
3.字典的遍历\访问;
使用for key, value in dict.items()可以遍历整个字典。如果你只喜欢遍历键名或值,你可以只使用for key in dict.keys()或 for value in dict.values()。
# 1. 遍历 keys-value
for key, value in d1.items():
print("{}->{}".format(key, value))
for key, _ in d1.items(): #丢弃一项;
print(key)
# 2. 遍历key
for key in d1.keys():
print(key,type(key)) # str / int
for k in d:
print(d[k])
# 3. 遍历value
for value in d1.values():
print(value)
# 4. 遍历item,即kv对;
for item in d.items():
print(item)
print(item[0],item[1])
5. 通用写法:一般不会出现异常;
for k in d: # 遍历输出的是字典的keys ;
print(d[k])
3.2 对字典的遍历默认遍历的是 key ;
1.对字典的遍历都是遍历的 key ;
# 形式1
d = {1: 2000, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 'b': 3000}
for i in d:
print(i)
----------------------------
1
2
3
4
5
6
7
8
9
b
# 形式2
for k in d.keys():
set(d)
list(d) 、list(d.keys())
for k in d: # 增加元素; dictionary changed size during iteration;
d['a00']=100
values 表示: d.get[k]
4.字典的内置方法
序号 | 函数及描述 | |
---|---|---|
1 | len(dict) | 计算字典元素个数,即键的总数。 |
2 | str(dict) | 输出字典可打印的字符串表示。 |
3 | type(variable) | 返回输入的变量类型,如果变量是字典就返回字典类型。 |
5.缺省字典 collections.defaultdict([default_factory[,...]])
第一个参数时default_factory,缺省为None,它提供一个初始化的函数,当key不存在的时候,这个工厂函数来生成key对应的value
方法1:
import random
from collections import defaultdict
d=defaultdict(list)
for c in 'abcde':
for i in range(random.randint(1,5)):
if d[c] not in d:
d[c]=[]
d[c].append(i)
print(d)
方法2,3:
import random
d={}
for c in 'abcde':
for i in range(random.randint(1,5)):
if not d.get(c): # if c not in d.keys():
d[c]=[]
d[c].append(i)
print(d)
总结:
1.
import random
from collections import defaultdict
d=defaultdict(list)
#等价于 d[c]=[]
if d[c] not in d:
d[c]=[]
总结
1.缺省字典中很多源码都在用;
2.字典为空dict 时,append会报错;缺省字典相当于添加一个空list ;
5.有序字典 OrderedDict (3.6.3版本才出现的;Ipython不会显示;原生Python才行)
记录Key插入的顺序;
# 有序字典的创建;
from collections import OrderedDict
d1 = OrderedDict()
d = {}
d['Tom']='A'
d['Jack']='B'
d['Leo']='C'
d['Alex']='D'
print('无序字典(dict):')
for k,v in d.items():
print(k,v)
d1 = OrderedDict() # 保证写入顺序
d1['Tom']='A'
d1['Jack']='B'
d1['Leo']='C'
d1['Alex']='D'
print('\n有序字典(OrderedDict):')
for k,v in d1.items():
print(k,v)
---------------------------------
无序字典(dict):
Leo C
Jack B
Tom A
Alex D
有序字典(OrderedDict):
Tom A
Jack B
Leo C
Alex D