Fork me on GitHub

Python基础—字典(dict)和集合(set)


环境及版本

1
2
3
Windows 10 x64
Python 2.7
Pycharm 4.5.1

字典(dict)

  • 是python中唯一内建的映射类型,字典中的值是无序的
  • 在Java中也就是map,是key-value键值对
  • 键可以是数字、字符串、元组等不可变元素

字典的创建

  • 字典由多个键值对组成,之间用逗号隔开
  • 键和值之间用冒号分割,而整个dict则用花括号括起
  • 空字典用{}表示
1
2
3
4
age_dict = {'Alex': 22, 'Bob': 21, 'Tom': 25, 'Beth': 18}
print age_dict

{'Bob': 21, 'Beth': 18, 'Alex': 22, 'Tom': 25}

dict类型

  • 可以其他映射的序列来建立字典
1
2
3
4
5
6
7
student_list = [('name','Alex'),('age',20),('gender','male')]
student_dict = dict(student_list)
print student_dict
print student_dict['name']

{'gender': 'male', 'age': 20, 'name': 'Alex'}
Alex
  • 也可以通过关键字参数来创建dict
1
2
3
4
student_list_1 = dict(name='Tom', age=20)
print student_list_1

{'age': 20, 'name': 'Tom'}

字典操作

字典的基本操作与序列类似

  • len()返回参数中键值对的数量
  • d[k]返回键k上对应的值
  • d[k]=x类似于赋值语句,设定键k上的值为x
  • dek d[k]删除键为k的那一项
  • k in d检查d中是否含有键为k的项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
print len(student_dict)
print student_dict['gender']
student_dict['age'] = 23
print student_dict
del student_dict['age']
print student_dict
result = 'name' in student_dict
print result

3
male
{'gender': 'male', 'age': 23, 'name': 'Alex'}
{'gender': 'male', 'name': 'Alex'}
True
  • 键类型:可以是任意不可变类型,如浮点数、字符串、元组等
  • 自动添加:即使键一开始并不存在,也可以为它赋值,这样dict就会建立新的键值对
  • 成员资格:表达式k in d查找的是键,而不是值
  • 在dict中查找成员资格比在list中效率高

字典的格式化字符串

  • 这是一种模版时的格式化,可以使需要格式化的字符串结构更加清晰
1
2
3
4
hobby_dict = {'Bob':'game','Alex':'tennis','Tom':'basketball'}
print "My hobby is %(Tom)s" % hobby_dict

My hobby is basketball

字典方法

clear方法

  • 用于清除字典中的所有项,这是一个原地操作,没有返回值
1
2
3
4
5
clear_dict = {'name':'Bob','age':23}
clear_dict.clear()
print clear_dict

{}

copy方法

  • 浅拷贝:返回一个具有相同键值对的新dict,这种方式是引用,指向同一块内存地址
1
2
3
4
5
6
7
8
9
10
11
12
light_copy = {'name':'Tom','hobby':['basketball','fishing']}
light_copy_dict = light_copy.copy()
light_copy_dict['name'] = 'Alex'
print light_copy
print light_copy_dict['hobby'].remove('fishing')
print light_copy
print light_copy_dict

{'hobby': ['basketball', 'fishing'], 'name': 'Tom'}
None
{'hobby': ['basketball'], 'name': 'Tom'}
{'hobby': ['basketball'], 'name': 'Alex'}
  • 深拷贝:复制其包含的所有值,这是重新创建一个dict,内存地址不同
1
2
3
4
5
6
7
8
9
10
11
from copy import deepcopy
deepcopy_dict = {}
deepcopy_dict['names'] = ['Tome','Tob','Alex']
deepcopy_dict_1 = deepcopy_dict.copy()
deepcopy_dict_2 = deepcopy(deepcopy_dict)
deepcopy_dict_2['names'].append('Jack')
print deepcopy_dict_1
print deepcopy_dict_2

{'names': ['Tome', 'Tob', 'Alex']}
{'names': ['Tome', 'Tob', 'Alex', 'Jack']}

fromkeys方法

  • 用于使用给定的键,建立新的字典,每个键都对应一个默认值None
  • 如果不想用None作为默认值,可以自己指定默认值
1
2
3
4
5
print dict.fromkeys(['name','age'])
print dict.fromkeys(['name','age'],'NULL')

{'age': None, 'name': None}
{'age': 'NULL', 'name': 'NULL'}

get方法

  • 通过get可以获取对应键的值,并且在键值不存在时返回默认None
  • 默认值None可以自己指定
1
2
3
4
5
6
7
print deepcopy_dict.get('xxx')
print deepcopy_dict.get('names')
print deepcopy_dict.get('yyy','NULL')

None
['Tome', 'Tob', 'Alex']
NULL

has_key方法

  • 该方法可以检查字典中是否含有特定的键
  • python3.0不包括这个函数
1
2
3
4
5
print deepcopy_dict.has_key('names')
print deepcopy_dict.has_key('age')

True
False

items和iteritems方法

  • items方法返回所有键值对组成的列表,但并没有顺序,因为dict本身是无序的
  • iteritems会返回一个迭代器,而不是列表
  • 在一些情况下iteritems会高效很多
1
2
3
4
5
6
print hobby_dict.items()
for x in hobby_dict.iteritems():
print x,

[('Bob', 'game'), ('Alex', 'tennis'), ('Tom', 'basketball')]
('Bob', 'game') ('Alex', 'tennis') ('Tom', 'basketball')

keys和iterkeys方法

  • keys方法将字典中的键以列表的形式返回
  • iterkeys则返回一个迭代器,而不是列表
1
2
3
4
5
6
print hobby_dict.keys()
for x in hobby_dict.iterkeys():
print x,

['Bob', 'Alex', 'Tom']
Bob Alex Tom

pop方法

  • 获取对应给定键的值,然后将这个键值对从dict中删除
1
2
3
4
5
6
pop_dict = {'name':'Tom','age':20}
print pop_dict.pop('name')
print pop_dict

Tom
{'age': 20}

popitem方法

  • 因为dict是无序的,所以popitem方法是随机弹出一项
  • 同样因为无序,dict中没有append方法
1
2
3
4
5
6
popitem_dict = {'name':'Alex','gender':'male','age':20,'hobby':'tennis'}
print popitem_dict.popitem()
print popitem_dict

('gender', 'male')
{'age': 20, 'name': 'Alex', 'hobby': 'tennis'}

setdefault方法

  • 类似与get方法,能够获得给定键所对应的值
  • 同样还能在不含有给定键的情况下设定相应的键值
1
2
3
4
5
6
7
8
9
10
setdefault_dict = {}
setdefault_dict.setdefault('name','NULL')
print setdefault_dict
setdefault_dict['name'] = 'Tom'
print setdefault_dict.setdefault('name','xxx')
print setdefault_dict

{'name': 'NULL'}
Tom
{'name': 'Tom'}

update方法

  • 可以利用一个dict项更新另一个dict
  • 若有相同的项,则会被替换掉
1
2
3
4
5
6
update_dict = {'name':'Alex','gender':'male','age':20,'hobby':'tennis'}
change_dict = {'language':'chinese'}
update_dict.update(change_dict)
print update_dict

{'gender': 'male', 'age': 20, 'name': 'Alex', 'language': 'chinese', 'hobby': 'tennis'}

values和itervalues方法

  • values返回dict中值的列表,返回列表中可以包含重复元素
  • itervalues返回的是一个迭代器,而不是列表
1
2
3
4
5
6
print update_dict.values()
for x in update_dict.itervalues():
print x,

['male', 20, 'Alex', 'chinese', 'tennis']
male 20 Alex chinese tennis

集合(set)

  • set是一个无序不重复的元素集合,基本功能是关系测试和消除重复
  • 集合对象支持union(并集)、intersection(交集)、difference(差集)、sysmmetric difference(对称差集)
  • set是一个只有key的集合

set类型

  • set可以将传入的序列变成一个set类型
  • 当传入的序列中有重复元素时,会自动去重
1
2
3
4
set_list = [1,2,2,2,3,4,5,5,6]
print set(set_list)

set([1, 2, 3, 4, 5, 6])

集合的运算

  • 交集运算
1
2
3
4
5
6
//set_1.intersection(set_2)
set_1 = set([1,2,3,4,5])
set_2 = set([3,4,5,6,7,8])
print set_1 & set_2

set([3, 4, 5])
  • 并集运算
1
2
3
4
//set_1.union(set_2)
print set_1 | set_2

set([1, 2, 3, 4, 5, 6, 7, 8])
  • 差集运算
1
2
3
4
//set_1.difference(set_2)
print set_1 - set_2

set([1, 2])
  • 对称差集
1
2
3
4
//set_1.symmetric_difference(set_2)
print set_1 ^ set_2

set([1, 2, 6, 7, 8])

基本操作

add和update方法

  • add用于在set中添加一项
  • update用于在set中添加多项
1
2
3
4
5
6
7
8
set_3 = set([0,1,2,3])
set_3.add(4)
print set_3
set_3.update([5,6])
print set_3

set([0, 1, 2, 3, 4])
set([0, 1, 2, 3, 4, 5, 6])

len方法

  • 返回set的长度
1
2
3
print len(set_3)

7

in方法

  • 检测某个key是否在set中
1
2
3
4
5
print 0 in set_3
print 10 in set_3

True
False

discard方法

  • 在set中存在这个元素,则删除;返回值为None
1
2
3
4
set_3.discard(1)
print set_3

set([0, 2, 3, 4, 5, 6])

pop方法

  • 随机返回一个元素,然后从set中删除
1
2
3
4
5
print set_3.pop()
print set_3

0
set([2, 3, 4, 5, 6])

clear方法

  • 清空整个set,返回值为None
1
2
3
4
set_3.clear()
print set_3

set([])

参考:Python基础教程(第2版·修订版)


转载请注明出处


Thank you for your support.