python入门(四)——dict, set

本章介绍python的一些数据结构

  • dict 字典
  • set 集合

dict字典

字典是用来映射的。它的映射方式就是hash的形式,即key键值与value值一一对应。

创建方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 方法一:直接创建。使用花括号。
# 冒号前是键值key,冒号后面是它对应的值
>>> dict1 = {1:'one', 2:'two', 3:'three'}
>>> dict1
{1: 'one', 2: 'two', 3: 'three'}

# 方法二:等号

>>> dict2 = dict(key1='value1')
>>> dict2 = dict(key1='value1',key2 = 'val2')
>>> dict2
{'key2': 'val2', 'key1': 'value1'}

# 要注意到,等号的创建方式,前面的key值不能是表达式,也就是不能实现上面的1,2,3,的那种形势。
>>> dict2 = dict(1='one',2='two',3 = 'three')
File "<stdin>", line 1
SyntaxError: keyword cant be an expression

# 方法三:fromkeys通过键值创建字典
>>> seq = ('bella','julia','mary')
# 可以不带值,直接用序列去当做key值,生成一个新的字典
>>> dict3 = dict.fromkeys(seq,)
>>> dict3
{'bella': None, 'mary': None, 'julia': None}
# 也可以带值,这个值是付给每一个key值的
# 不能企图只给其中某几个key值赋值
>>> dict3.fromkeys(seq,10)
{'bella': 10, 'mary': 10, 'julia': 10}

# 如果要添加item(也就是key值+值)进字典中怎么办呢?直接用方括号赋值就行啦
>>> dict1[1]= 'one'
>>> dict1
{1: 'one', 3: 'three'}

# 要注意的是,如果本来就已经有了这个key值,那么直接会覆盖原有的value,不会重复添加。因为一个字典里,key值是唯一的,不能重复的。value可以重复。
>>> dict1[1] = 1
>>> dict1
{1: 1, 2: 'two', 3: 'three'}
>>>

一些操作

values()

用于获得值

1
2
3
4
5
>>> dict1
{1: 'one', 2: 'two', 3: 'three'}
>>> dict1.values()
dict_values(['one', 'two', 'three'])
>>>

keys()

用于获得key值

值得注意的是,keys(),values()等,与for连用的时候比较多,因为就获取一个值也没有多大意义,批量操作威力才比较大,也比较显示程序的用处嘛

1
2
3
4
5
6
7
8
9
>>> dict1.keys()
dict_keys([1, 2, 3])
>>> for eachkey in dict1.keys():
... print(eachkey+1)
...
2
3
4
>>>

items()

用于获得key值+值

1
2
3
>>> dict1.items()
dict_items([(1, 'one'), (2, 'two'), (3, 'three')])
>>>

popitem()

用于随机弹出一组键值和值,并在字典中删除它

1
2
3
4
5
6
7
8
>>> dict1
{1: 'one', 2: 'two', 3: 'three'}
>>> dict1.popitem()
# 可以看到,它选中了3,弹出来了
(3, 'three')
# 然后我们再看字典里,已经没有这个3了
>>> dict1
{1: 'one', 2: 'two'}

pop()

用于弹出指定键值的值,并在字典中删除它

1
2
3
4
5
6
>>> dict1
{1: 'one', 2: 'two'}
>>> dict1.pop(1) # 我们指定要弹出键值为1的
'one'
>>> dict1 # 可以看到,已经被弹出并删除了
{2: 'two'}

get()

用于弹出指定键值的值,如果找不到,可以返回一个设置的默认值,或者none

1
2
3
4
5
6
7
8
9
# 带默认值,直接跟在想要get的key值后面,用逗号隔开
>>> dict1
{1: 'one', 2: 'two', 3: 'three'}
>>> dict1.get(4,'four')


# 不带默认值,则是none。如果不用print,就什么反应都没有
>>> print(dict1.get(5))
None

copy()

进行浅拷贝

先说一下深浅拷贝

  • 深拷贝:相当于一个指针,指向了原来的地址。如果修改深拷贝的内容,那么原来的内容也会跟着改动
  • 浅拷贝:相当于重新开辟了一个地方,把跟拷贝内容相同的内容原样复制过去。修改浅拷贝的内容,原来内容不会有一点影响

我们来看一个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> a = {1: 'one', 2: 'two', 3: 'three'}
>>> b = a.copy()
>>> c = a
>>> id(a) # 注意看a的地址
4312668424
>>> id(b) # b的地址和a的就不一样了,说明是新开辟的
4312668360
>>> id(c) # c的地址和a一样,相当于知道a的家在哪里,直接住在a的家里一样
4312668424

>>> b[4] = 'four' # b添加了4进去
>>> b
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
>>> a # a丝毫不受影响
{1: 'one', 2: 'two', 3: 'three'}

>>> c[4] = 'four' # c也添加了4进去
>>> a # a也跟着变了。因为c和a住在一起了
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}

setdefault() 与get()的区别

setdefault() 和get()很像,但是get设置默认值之后,不会对原来的字典进行添加,但是setdefault比较智能一点,它会添加进去

1
2
3
4
>>> dict1.setdefault(5,'five')	
'five'
>>> dict1
{1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'}

update() 用来更新字典

两种更新可能性:

  • 原本存在新字典中的key值:替换原值
  • 原本不存在新字典中的key值:增加这一组key值和原值
1
2
3
4
5
6
7
8
9
10
11
12
13
# 原本没有的key值
>>> dict2 = {6:'six',7:'seven'} # 6,7在dict1中没有哦
>>> dict1.update(dict2) # 用dict2去更新1
>>> dict1 # 可以看到dict1有了6,7
{1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six', 7: 'seven'}


# 原本有key值
>>> dict3 = {4:'4',5:'5'}
>>> dict1.update(dict3)
>>> dict1 # 4,5被替换了呢
{1: 'one', 2: 'two', 3: 'three', 4: '4', 5: '5', 6: 'six', 7: 'seven'}

字典就介绍道这里,是不是很方便?

set集合

因为集合要讲的内容不多,所以就一起写在dict这里啦

集合,学过数学的都记得,是一些东西的组成的集体。无关顺序,无关出现次数。也就是说,无论它是按照什么样的顺序出现,或是出现很多次,都不影响。集合只知道它存在,或者不存在

创建方式

有两种

  • {}的创建:大家不要误会,跟字典的创建确实是一样的,但是字典还有:来表示映射关系,但集合没有,直接用{}括起来就行啦
  • set([])来创建
1
2
3
4
5
6
7
>>> set1 = set([3,1,2,0])
>>> set1
{0, 1, 2, 3} # 惊讶的发现它会自动排序哦

>>> set2 = {1,2,3,3,3,3,4,4,5,5,6}
>>> set2
{1, 2, 3, 4, 5, 6} # 自动把重复的剔除了呢!

访问

访问的方式没有什么独特的,就是for,in 或not in

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> set2
{1, 2, 3, 4, 5, 6}
>>> for each in set2:
... print(each**2)
...
1
4
9
16
25
36

>>> set2
{0, 1, 2, 3}

>>> 2 in set2
True # 2在集合2中

>>> 6 in set2
False # 6不在集合2中

添加、删除元素

1
2
3
4
5
6
7
>>> set2.add(6)
>>> set2
{0, 1, 2, 3, 6}
>>> set2.remove(0)
>>> set2
{1, 2, 3, 6}

冰冻集合

除了这种可以变动的集合,如果想有一个集合,是不能被修改的,那就是frozenset啦,冰冻集合

1
2
3
4
5
>>> set3 = frozenset([1,2,3,4,5])
>>> set3.add(6)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'

可以看到如果想要改动它,就会报错

另外,集合是不能进行索引的,否则会酱:

1
2
3
4
>>> set2[1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'set' object does not support indexing