1.1.字典
1.1.1.字典定义
字典是包含若干“键:值”元素的无序可变序列,字典中的每个元素包含“键”和“值”两部分,定义字典时,每个元素的键和值用冒号分隔,元素之间用逗号分隔,所有的元素放在一对大括号“{}”中。字典中的键可以为任意不可变数据,比如整数、实数、字符串、元组等等。
1.1.2.字典的创建
创建 使用“=”将一个字典赋值给另一个变量
例如:
a_dict = {'server':'db.neuedu.com','database':'mysql'}
print(a_dict)
输出:
{'server': 'db.neuedu.com', 'database': 'mysql'}
x = {} #空字典
print(x)
输出:
{}
利用dict()利用已有数据创建字典
例如:
keys = ['a','b','c','d']
values = [1,2,3,4]
dictionary = dict(zip(keys,values))
print(dictionary)
输出:
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
使用dict()根据给定的键、值创建字典
例如:
d = dict(name = 'Dong',age = 37)
print(d)
输出:
{'name': 'Dong', 'age': 37}
以给定内容为键,创建值为空的字典
例如:
adict = dict.fromkeys(['name','age','sex'])
print(adict)
输出:
{'name': None, 'age': None, 'sex': None}
1.1.3.字典元素的读取
- 以键作为下标可以读取字典元素,若键不错在则抛出异常
例如:
adict = {'name':'Dong','sex':'male','age':37}
print(adict['name'])
输出:
Dong
- 使用字典对象的get方法获取指定键对应的值,并且可以在键不存在的时候返回指定值
例如:
adict = {'name':'Dong', 'sex':'male', 'age':37}
print(adict.get('address'))
print(adict.get('address','SDIBT'))
adict['score'] = adict.get('score',[])
adict['score'].append(98)
adict['score'].append(97)
print(adict)
输出:
None
SDIBT
{'name': 'Dong', 'sex': 'male', 'age': 37, 'score': [98, 97]}
- 使用字典对象的item()方法可以返回字典的键、值对列表
例如:
adict = {'name':'Dong', 'sex':'male', 'age':37}
for item in adict.items(): #输出字典中所有元素
print(item)
for key in adict: #不加特殊说明,默认输出键
print(key)
输出:
('name', 'Dong')
('sex', 'male')
('age', 37)
name
sex
age
- 使用字典对象的keys()方法可以返回字典的键列表
例如:
adict = {'name':'Dong', 'sex':'male', 'age':37}
print(adict.keys()) #返回所有键
输出:
dict_keys(['name', 'sex', 'age'])
- 使用字典对象的values()方法可以返回字典的值列表
例如:
adict = {'name':'Dong', 'sex':'male', 'age':37}
print(adict.values()) #返回所有值
输出:
dict_values(['Dong', 'male', 37])
- 使用字典对象的setdefault()方法返回指定“键”对应的“值”,如果字典中不存在该“键”,就添加一个新元素设置该“键”对应的“值”。
例如:
adict = {'name':'Wang','sex':'male'}
adict.setdefault('age','28') #添加新元素
print(adict)
输出:
{'name': 'Wang', 'sex': 'male', 'age': '28'}
1.1.4.字典元素的添加
- 当以指定键为下标为字典赋值时,若键存在,则可以修改该键的值;若不存在,则表示添加一个键、值对。
例如:
adict = {'name':'Wang','sex':'male'}
adict.setdefault('age','28')
adict['age'] = 38
print(adict)
adict['address'] = 'SDIBT'
print(adict)
输出:
{'name': 'Wang', 'sex': 'male', 'age': 38}
{'name': 'Wang', 'sex': 'male', 'age': 38, 'address': 'SDIBT'}
- 使用字典对象的update方法将另一个字典的键、值对添加到当前字典对象
例如:
adict = {'name':'Wang','sex':'male'}
print(adict.items())
adict.update({'a':'a','b':'b'})
print(adict)
输出:
dict_items([('name', 'Wang'), ('sex', 'male')])
{'name': 'Wang', 'sex': 'male', 'a': 'a', 'b': 'b'}
1.1.5.字典删除
- 使用del删除整个字典,或者字典中的指定元素
- 使用pop()和popitem()方法弹出并删除指定元素
- 使用clear()方法清空字典中所有元素
字典clear()方法
clear()方法是用来清除字典中的所有数据,因为是原地操作,所以返回None(也可以理解为没有返回值)
x = {}
x['name'] = 'lili'
x['age'] = 20
print(x)
x.clear()
print(x)
输出:
{'name': 'lili', 'age': 20}
{}
字典pop()方法
移除字典数据pop()方法的作用是:删除指定给定键所对应的值,返回这个值并从字典中把它移除。注意字典pop()方法与列表pop()方法作用完全不同。
x = {'a':1,'b':2}
print(x.pop('a'))
print(x)
输出:
1
{'b': 2}
字典popitem()方法
字典popitem()方法作用是:随机返回并删除字典中的一对键和值(项)。为什么是随机删除呢?因为字典是无序的,没有所谓的“最后一项”或是其它顺序。在工作时如果遇到需要逐一删除项的工作,用popitem()方法效率很高。
x = {'url':'www.neuedu.com','title':'python web site'}
print(x.popitem())
print(x)
输出:
('title', 'python web site')
{'url': 'www.neuedu.com'}
1.1.6.判断一个key是否在字典中
使用in方法
#生成一个字典
d = {'name':'tom','age':10,'Tel':110}
#打印返回值,其中d.keys()是列出字典所有的key
print('name' in d.keys())
print('name' in d)
#两个的结果都是返回True
除了使用in还可以使用not in,判定这个key不存在。
1.1.7.遍历字典
(1)遍历key值
a = {'a':'1','b':'2','c':'3'}
for key in a.keys():
print(key+':'+a[key])
输出:
a:1
b:2
c:3
在使用上,for key in a和for key in a.keys():完全等价
(2)遍历value值
for value in a.values():
print(value)
输出:
1
2
3
(3)遍历字典项
for kv in a.items():
print(kv)
输出:
('a', '1')
('b', '2')
('c', '3')
(4)遍历字典键值
for key,value in a.items():
print(key+':'+value)
输出:
a:1
b:2
c:3
在使用上for key,value in a.items()与for(key,value) in a.items()完全等价
1.1.8.有序字典
python内置字典是无序的,如果需要一个可以记住元素插入顺序的字典,可以使用collections.OrderedDict
例如:
x = dict() #无序字典
x['a'] = 3
x['b'] = 5
x['c'] = 8
print(x)
import collections
x = collections.OrderedDict() #有序字典
x['a'] = 3
x['b'] = 5
x['c'] = 8
print(x)
输出:
{'a': 3, 'b': 5, 'c': 8}
OrderedDict([('a', 3), ('b', 5), ('c', 8)])
1.2.集合
1.2.1.集合定义
集合是无序可变序列,使用一对大括号界定,元素不可重复,同一个集合中每个元素都是唯一的。集合中只能包含数字、字符串、元组等不可变类型的数据,而不能包含列表、字典、集合等可变类型的数据。
1.2.2.集合的创建
直接将集合赋值给变量
例如:
a = {3,5}
a.add(7)
print(a)
输出:
{3, 5, 7} #向集合中添加元素
使用set将其他类型数据转换为集合
例如:
a_set = set(range(8,14))
print(a_set)
b_set = set([0,1,2,3,0,1,2,3,7,8]) #自动去除重复
print(b_set)
c_set = set() #空集合
print(c_set)
输出:
{8, 9, 10, 11, 12, 13}
{0, 1, 2, 3, 7, 8}
set()
1.2.3.集合的删除
使用del删除整个集合
1.2.4.集合元素的增加与删除
增加元素 使用add()方法为集合添加新元素,如果该元素已存在于该集合中则忽略该操作。
例如:
s = {1,2,3}
s.add(3)
print(s)
输出:
{1,2,3}
使用update()方法合并另外一个集合中的元素到当前集合中
例如:
s = {1,2,3}
s.update({3,4,5})
print(s)
输出:
{1,2,3,4,5}
删除元素 当不再使用某个集合时,可以使用del命令删除整个集合。集合对象的pop()方法弹出并删除其中一个元素,remove()方法直接删除指定元素,clear()方法清空集合。
例如:
a = {1,4,2,3}
print(a.pop())
print(a.pop())
print(a)
a.add(2)
print(a)
a.remove(3)
print(a)
输出:
1
2
{3, 4}
{2, 3, 4}
{2, 4}
1.2.5.集合操作
python集合支持交集、并集、差集等运算
例如:
a_set = set([8,9,10,11,12,13])
b_set = set([0,1,2,3,7,8])
print(a_set|b_set) #并集
print(a_set.union(b_set)) #并集
print(a_set & b_set) #交集
print(a_set.intersection(b_set)) #交集
print(a_set.difference(b_set)) #差集
print(a_set - b_set) #差集
输出:
{0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13}
{0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13}
{8}
{8}
{9, 10, 11, 12, 13}
{9, 10, 11, 12, 13}
x = {1,2,3}
y = {1,2,5}
z = {1,2,3,4}
print(x.issubset(y)) #测试是否为子集
print(x < y) #比较集合大小/包含关系
print(x.issubset(z))
print(x < z) #真子集
输出:
False
False
True
True
1.3.综合练习
1.3.1.统计单词出现次数
word = "I'm a boy,I'm a girl.When it is true,it is ture.that are cats,the red is red"
word = word.replace(',','').replace('.','')
word = word.split()
print(word)
print('第1种方法')
setword = set(word)
for i in setword:
count = word.count(1)
print(i,'出现次数:',count)
print('第2种方法')
dict = {}
for key in word:
dict[key] = dict.get(key,0) + 1
print(dict)
print('第3种方法')
from collections import Counter
result = Counter(dict)
print(result)
print(result.most_common(3))
1.3.2.奥运会足球分组
已知有十六支男子足球队参加2008北京奥运会。写一个程序,把这16支球队随机分为4个组。采用List集合和随机数
# // map,保存最终分组结果
# // key保存的是第几组,value是该组对应的国家集合
import random
groupNum2Countrys = {}
strCountrys = "科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚,日本,美国,中国,新西兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利";
countryList = strCountrys.split(",")
for i in range(4):
lstGroup = []
# // 分第1组
# // 随机从集合中选出一个国家,放到第1组里;然后将这个选出的国家,从原来集合中干掉(删除)
# // 重复以上步骤4次
for j in range(4):
selectIndex = random.randint(0,len(countryList)-1)
lstGroup.append(countryList[selectIndex])
countryList.remove(countryList[selectIndex])
groupNum2Countrys[i+1] = lstGroup
for key,value in groupNum2Countrys.items():
print('第' + str(key) + '组')
print(value)
输出:
第1组
['荷兰', '比利时', '塞尔维亚', '阿根廷']
第2组
['意大利', '韩国', '洪都拉斯', '巴西']
第3组
['澳大利亚', '中国', '科特迪瓦', '尼日利亚']
第4组
['喀麦隆', '日本', '新西兰', '美国']