字典
1、字典是由键-值(key-value)对构成的映射数据类型 ,字典也被称作关联数组或哈希表
2、字典元素用大括号{ }包裹
3、字典中的键是唯一的,而值并不唯一
4、值可以取任何数据类型,但键必须是不可变的,如字符串,数或元组
5、通过键取值,不支持下标操作
6、不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住
1、创建字典
1.通过{ }操作符创建字典
2.通过dict()工厂方法创建字典
3.通过fromkeys()创建具有相同值的默认字典
#!/usr/bin/env python #coding:utf-8 aDict = {'name':'bob', 'age':23} bDict = dict((['name', 'bob'], ['age', 23])) cDict = {}.fromkeys(('bob', 'alice'), 23) print aDict print bDict print cDict
执行结果:
{'age': 23, 'name': 'bob'} {'age': 23, 'name': 'bob'} {'bob': 23, 'alice': 23}
2、访问字典
字典是映射类型,意味着它没有下标,访问字典中的值需要使用相应的键
#!/usr/bin/env python #coding:utf-8 aDict = {'name':'bob', 'age':23} for eachKey in aDict: print "key=%s,value=%s" % (eachKey,aDict[eachKey]) print '%(name)s' % aDict
执行结果:
key=age,value=23 key=name,value=bob bob
3、更新字典
1.通过键更新字典
2.如果字典中有该键,则更新相关值
3.如果字典中没有该键,则向字典中添加新值
#!/usr/bin/env python #coding:utf-8 aDict = {'name':'bob', 'age':23} print aDict aDict['age'] = 22 print aDict aDict['email'] = '123@qq.com' print aDict
执行结果:
{'age': 23, 'name': 'bob'} {'age': 22, 'name': 'bob'} {'age': 22, 'name': 'bob', 'email': '123@qq.com'}
4、删除字典
1.通过del可以删除字典中的元素或整个字典
2.使用内部方法clear()可以清空字典
3.使用pop()方法可以“弹出”字典中的元素
#!/usr/bin/env python #coding:utf-8 aDict = {'name':'bob', 'age':23} print aDict aDict['age'] = 22 print aDict aDict['email'] = '123@qq.com' print aDict del aDict['email'] print aDict print aDict.pop('age') print aDict aDict.clear() print aDict
执行结果:
{'age': 23, 'name': 'bob'} {'age': 22, 'name': 'bob'} {'age': 22, 'name': 'bob', 'email': '123@qq.com'} {'age': 22, 'name': 'bob'} 22 {'name': 'bob'} {}
5、字典操作符
1.使用字典键查找操作符[ ],查找键所对应的值
2.使用in和not in判断键是否存在于字典中
#!/usr/bin/env python #coding:utf-8 aDict = {'name':'bob', 'age':23} print aDict['name'] print 'bob' in aDict print 'name' in aDict
执行结果:
bob
False
True
6、作用于字典的函数
1.len():返回字典中元素的数目
2.hash():本身不是为字典设计的,但是可以判断某个对象是否可以作为字典的键
#!/usr/bin/env python #coding:utf-8 aDict = {'name':'bob', 'age':23} print aDict print len(aDict) print hash(3) print hash([])
执行结果:这里的报错顺序做了调整
{'age': 23, 'name': 'bob'} 2 3
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list
7、字典内置函数&方法
Python字典包含了以下内置函数
序号 | 函数及描述 |
---|---|
1 | cmp(dict1, dict2) 比较两个字典元素。 |
2 | len(dict) 计算字典元素个数,即键的总数。 |
3 | str(dict) 输出字典可打印的字符串表示。 |
4 | type(variable) 返回输入的变量类型,如果变量是字典就返回字典类型。 |
Python字典包含了以下内置函数
序 号 | 函数 | 描述 |
1 | clear(self) | 删除字典内所有的元素 |
2 | copy(self) | 返回一个字典的浅copy ,俗称赋值 |
3 | fromkeys(*args,**kwargs) | 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值 |
4 | get(self,k,d=None) | 返回指定键的值,如果值不在字典中返回default值 |
5 | items(self) | 以列表返回可遍历的(键, 值) 元组数组 |
6 | keys(self) | 以列表返回一个字典所有的键 |
7 | pop(self,k,d=None) | 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值 |
8 | popitem(self) | 随机返回并删除字典中的一对键和值 |
9 | setdefault(self,k,d=None) | 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default |
10 | update(self,E=None,**F) | 把self的东西更新到外面字典 |
11 | values(self) | 以列表返回字典中的所有值 |
字典操作实例:
>>> aDict = {'age': 23, 'name': 'bob'}
>>> aDict
{'age': 23, 'name': 'bob'}
>>> aDict['gender'] = 'male' #增加
>>> aDict
{'gender': 'male', 'age': 23, 'name': 'bob'}
>>> aDict.clear() #删除字典内所有元素
>>> aDict #clear()方法是用来清除字典中的所有数据,因为是原地操作,所以返回None(也可以理解为没有返回值)
{}
>>> aDict = {'gender': 'male', 'age': 23, 'name': 'bob'}
>>> aDict
{'gender': 'male', 'age': 23, 'name': 'bob'}
>>> bDict = aDict.copy() #返回字典的浅复制
>>> bDict
{'gender': 'male', 'age': 23, 'name': 'bob'}
>>>
>>> bDict['name'] = "john"
>>> bDict
{'gender': 'male', 'age': 23, 'name': 'john'}
>>> aDict
{'gender': 'male', 'age': 23, 'name': 'bob'}
>>>
#fromkeys() 函数用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值
#fromkeys()方法语法:dict.fromkeys(seq[, value]))
#seq -- 字典键值列表。
#value -- 可选参数, 设置键序列(seq)的值。
>>> seq = ["name",'age',"gender"]
>>> Dict1 = dict.fromkeys(seq)
>>> Dict1
{'gender': None, 'age': None, 'name': None}
>>>
>>>
>>> Dict1 = dict.fromkeys(seq,10)
>>> Dict1
{'gender': 10, 'age': 10, 'name': 10}
>>>
>>> Dict1.get("gender") #返回指定键的值,如果值不在字典中返回default值
10
>>> Dict1.has_key(10) #如果键在字典dict里返回true,否则返回false
False
>>> Dict1.has_key("age")
True
>>>
>>> Dict1.items() #以列表返回可遍历的(键, 值) 元组数组
[('gender', 10), ('age', 10), ('name', 10)]
>>>
>>> Dict1.keys() #以列表返回一个字典所有的键
['gender', 'age', 'name']
>>> Dict1.values() 以列表返回字典中的所有值
[10, 10, 10]
>>> Dict1.pop("gender") #删除给定键所对应的值,返回这个值并从字典中把它移除
10
>>> Dict1
{'age': 10, 'name': 10}
>>>
>>> Dict1.popitem() #随机返回并删除字典中的一对键和值(项)
('age', 10)
>>> Dict1
{'name': 10}
>>>
>>> Dict1.setdefault("age") #Python 字典 setdefault() 函数和get() 方法类似, 如果键不存在于字典中,将会添加键并将值设为默认值。
>>> Dict1
{'age': None, 'name': 10}
>>> Dict1.setdefault('name')
10
>>> Dict1
{'age': None, 'name': 10}
>>>
>>> Dict2 = {"gender":"male"}
>>> Dict1.update(Dict2) #把Dict2的键值对更新到Dict1里面
>>> Dict1
{'gender': 'male', 'age': None, 'name': 10}
>>> Dict2
{'gender': 'male'}
>>> Dict1.viewitems()
dict_items([('gender', 'male'), ('age', None), ('name', 10)])
>>> Dict1.viewkeys()
dict_keys(['gender', 'age', 'name'])
>>> Dict1.viewvalues()
dict_values(['male', None, 10])
>>>
元组嵌套:
>>> t = (11,22,["alex",{"k1":"v1"}])
>>> t[2][1]['k1']
'v1'
>>>
十三,tuple,dict,list之间的转换
直接声明的list和tuple无法通过dict()转换成dict类型
直接声明的dict可以通过tuple()和list()分别转换成tuple和list类型(结果只包含了keys),可是此时却能通过dict()反转回原来的dict类型
13-1、字典
#!/usr/bin/env python
#coding:utf-8
dict = {'name': 'Zara', 'age': 7}
#字典转为字符串
print str(dict)
#字典可以转为元组
print tuple(dict)
#字典可以转为元组
print tuple(dict.values())
#字典转为列表
print list(dict)
#字典转为列表
print dict.values()
执行结果:
{'age': 7, 'name': 'Zara'}
('age', 'name')
(7, 'Zara')
['age', 'name']
[7, 'Zara']
13-2、元组
#!/usr/bin/env python
#coding:utf-8
tup=(1, 2, 3, 4, 5,6,7,8)
#元组转为字符串
print tup.__str__()
#元组转为列表
print list(tup)
#元组不可以转为字典
执行结果:
(1, 2, 3, 4, 5, 6, 7, 8)
[1, 2, 3, 4, 5, 6, 7, 8]
13-3、列表
#!/usr/bin/env python
#coding:utf-8
nums=[1, 3, 5, 7, 9, 11, 13]
#列表转为字符串
print str(nums)
#列表转为元组
print tuple(nums)
#列表不可以转为字典
执行结果:
[1, 3, 5, 7, 9, 11, 13]
(1, 3, 5, 7, 9, 11, 13)
13-4、字符串
#!/usr/bin/env python
#coding:utf-8
str="(1,2,3)"
#字符串转为元组
print tuple(eval(str))
#字符串转为列表
print list(eval("(1,2,3)"))
#字符串转为字典
str1="{'name':'alex', 'age':24}"
print eval(str1)
执行结果:
(1, 2, 3)
[1, 2, 3]
{'age': 24, 'name': 'alex'}
9,练习字典
dic={'k1':"v1","k2":"v2","k3":[11,22,33]}
a.请循环输出所有的key
b.请循环输出所有的value
c.请循环输出所有的key和value
d.请在字典中添加一个键值对,"k4":"v4",输出添加后的字典
e.请在修改字典中“k1”对应的值为“alex”,输出修改后的字典
f.请在k3对应的值中追加一个元素44,输出修改后的字典
g.请在k3对应的值的第1个位置插入个元素18,输出修改后的字典
dic={'k1':"v1","k2":"v2","k3":[11,22,33]}
# a.请循环输出所有的key
for i in dic :
print(i)
for i in dic.keys():
print(i)
# b.请循环输出所有的value
for i in dic.values():
print(i)
c.请循环输出所有的key和value
for i,j in dic.items():
print(i,j)
# d.请在字典中添加一个键值对,"k4":"v4",输出添加后的字典
dic2 = {'k4':'v4'}
dic.update(dic2)
print(dic)
dic['k4'] = 'v4'
print(dic)
# e.请在修改字典中“k1”对应的值为“alex”,输出修改后的字典
dic['k1'] ='alex'
print(dic)
f.请在k3对应的值中追加一个元素44,输出修改后的字典
dic['k3'].append(44)
print(dic)
# g.请在k3对应的值的第1个位置插入个元素18,输出修改后的字典
dic['k3'].insert(0,18)
print(dic)
练习1:
编写一个石头、剪刀、布的游戏。你和计算机各出一项,判断输赢。
提示:计算机出什么,可以使用random模块中的choice随机在一个列表中选择某一项
#!/usr/bin/env python
#coding: utf8
import random
import sys
allList = ['石头', '剪刀', '布']
gDict = {'石头':0, '剪刀':1, '布':2}
prompt = """(0)石头
(1)剪刀
(2)布
请选择对应的数字: """
chnum = raw_input(prompt)
if chnum not in '012':
print 'Invalid choice'
sys.exit(1)
uchoice = allList[int(chnum)]
cchoice = random.choice(allList)
#print '您选择了:', uchoice, '
计算机选择了:',cchoice
print '您选择了: %s
计算机选择了:%s' % (uchoice, cchoice)
if uchoice == cchoice:
print '平局'
elif (gDict[cchoice] - gDict[uchoice] == 1) or (gDict[cchoice] - gDict[uchoice] == -2):
print 'You WIN!!!'
else:
print 'You LOSE!!!'
执行结果:
(0)石头
(1)剪刀
(2)布
请选择对应的数字: 0
您选择了: 石头
计算机选择了:剪刀
You WIN!!!
练习:寻找差异
# 数据库中原有
old_dict = {
"#1":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 },
"#2":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 }
"#3":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 }
}
# cmdb 新汇报的数据
new_dict = {
"#1":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 800 },
"#3":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 }
"#4":{ 'hostname':c2, 'cpu_count': 2, 'mem_capicity': 80 }
}
执行方法:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
old_dict = {
"#1":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },
"#2":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },
"#3":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 }
}
# cmdb 新汇报的数据
new_dict = {
"#1":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 800 },
"#3":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },
"#4":{ 'hostname':'c2', 'cpu_count': 2, 'mem_capicity': 80 }
}
#方法1:
for k in new_dict:
# #通过键更新值,