Python全栈(一)基础之7.Python数据结构-元组和字典

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/CUFEECR/article/details/102772574

一、元组的基本使用

序列:计算机中有序的排列数据的一种数据结构。
序列分为可变不可变两种。
元组:序列中的一种,表现形式即tuple,是一个不可变序列,没有添加、删改等方法。

列表和元组的原则:

一般,希望数据不改变时用元组,其他情况都用列表。

创建元组

用()创建元组。

my_tuple = (1,2,3,4,5)
print(my_tuple)
print(type(my_tuple))

输出

(1, 2, 3, 4, 5)
<class 'tuple'>

访问元素

用tuple[index]

my_tuple = (1,2,3,4,5)
print(my_tuple[3])

输出

4

给元素赋值会报错

my_tuple = (1,2,3,4,5)
my_tuple[3] = 6
print(my_tuple)

报错,TypeError: 'tuple' object does not support item assignment
※如果元组非空,它里面至少有一个。

my_tuple = 1,
print(my_tuple)

打印

(1,)

可以分别访问元素并赋值,即元组的解包,
解包指的是将元组每一个元都赋值给一个变量。

tpl = (1,2,3,4,5)
a,b,c,d,e = tpl
print(f'a={a}\nb={b}\nc={c}\nd={d}\ne={e}')

输出

a=1
b=2
c=3
d=4
e=5

解包的运用:
可运用于变量值的交换

a = 1
b = 2
a,b = b,a
print(f'a={a}\nb={b}')

打印

a=2
b=1

在对元素解包时,必须要变量的个数与元组的长度一致,会报错;

tpl = (1,2,3,4,5)
a,b = tpl
print(f'a={a}\nb={b}')

会报错,ValueError: too many values to unpack (expected 2)
※当变量和元组中的元素数量不一致,剩余元素用列表表示,即在变量前面加一个*,这样变量将会获取元组中剩余的元素,并且只能加一个*,不能加多个*;
※并且列表的位置可以与元组的任意连续区间对应。并且列表的位置可以与元组的任意连续区间对应。

tpl = (1,2,3,4,5)
a,b,*c = tpl
print(f'a={a}\nb={b}\nc={c}')

打印

a=1
b=2
c=[3, 4, 5]

又如,

tpl = (1,2,3,4,5)
*a,b,c = tpl
print(f'a={a}\nb={b}\nc={c}')

打印

a=[1, 2, 3]
b=4
c=5

二、可变对象

不可变类型:
int、float、string
可变类型:
list、tuple

每个对象在内存中保存了3个数据:
id(标识)
type(类型)
value(值)

举例:
列表a = [1,2,3],在内存中的一定区域,会分别保存一个对象的id(假设为0x111)、type(class list)、value([1,2,3]),
对元素进行改变即对值进行改变,

改对象:

如a[0] = 10,则a变为[10,2,3]
这个操作是通过变量修改对象里面的值,不会改变变量指向的操作。

改变量:

如a = [4,5,6],即a发生了改变,假设id变为0x211,此时为id(0x211)、type(class list)、value([4,5,6])
对变量重新赋值,会改变变量所指向的对象。
修改前:

a = [1,2,3]
print(a,id(a))

打印

[1, 2, 3] 1751338668616

改对象后:
a[0] = 10
print(a,id(a))
打印

[10, 2, 3] 2337822822984

改变量后:

a = [4,5,6]
print(a,id(a))

打印

[4, 5, 6] 1384044909640

将a赋给新变量b:

a = [1,2,3]
b = a
b[0] = 10
print('a:',a,id(a))
print('b:',b,id(b))

打印

a: [10, 2, 3] 1963325084232
b: [10, 2, 3] 1963325084232

显示,a和b的值和id完全一致。
解释:
生成a时,a对应的值为id(假设为0x111)、type(class list)、value([1,2,3]),
将a赋给b时,其实只是将b指向了a对应的内存对象的内存地址,并未分配新的内存空间给b,a和b共用一个内存地址,所以a和b打印出来的结果一致。

a = [1,2,3]
b = a
b = [10,2,3]
print('a:',a,id(a))
print('b:',b,id(b))

打印

a: [1, 2, 3] 2260109775432
b: [10, 2, 3] 2260109775944

此时b和a不一致,因为b是通过列表创建重新生成的,系统会重新分配一个内存地址,所以id会不同。

三、==和is

== 和 !=:
比较的是对象的值是否相等
is和is not比较的是对象的id是否相等

a = [1,2,3]
b = [1,2,3]
print(a == b)
print(a is b)

打印

True
False

!=和is not的用法类似。

四、字典的简介

1.定义

表现形式:dict
字典是一种新的数据结构,即映射(mapping)。
字典的作用:即存储对象的容器。
列表存储数据性能很好,但是查询数据性能很差;
字典中每一个元素都有唯一的名字,通过这个名字可以快速查找到指定的元素,这个唯一的名字称为键(key),通过key可以查找到值(value),所以字典也成为键值对(key-value),每个字典可以有多个键值对,每个键值对称为一项。
字典中键和值的类型
值可以是任意对象;
键可以是任意不可变的对象,包括int、str、bool、tuple等。

2.创建字典

(1)用{}

语法:{key1:value1,key2:value2,…}

d = {'name':'Tom','age':'20','gender':'male'}
print(d,type(d))

打印

{'name': 'Tom', 'age': '20', 'gender': 'male'} <class 'dict'>

字典的键不能重复,如有重复,则后边的会覆盖前边的。

d = {'name':'Tom','age':'20','gender':'male','name':'Jerry'}
print(d,type(d))

打印

{'name': 'Jerry', 'age': '20', 'gender': 'male'} <class 'dict'>

即前边的Tom被覆盖。
字典还可以跨行写,如

d = {
    'name':'Tom',
    'age':'20',
    'gender':'male'
    }
print(d,type(d))

输出与之前相同。

(2)用dict()函数

方式一:

d = dict(name = 'Tom',age=20,gender='male')
print(d)

打印

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

方式二:

d = dict([('name','Tom'),('age',20)])
print(d,type(d))

打印

{'name': 'Tom', 'age': 20} <class 'dict'>

解释:
dict()函数可以将一个包双值自序列转化为字典。
双值序列:即序列中只有两个值,如[3,4]、(‘name’,'hello)等。
子序列:如果序列中的元素也是序列,称这个元素为子序列,如[(1,2)]即为子学列

3.根据键来获取值

d = {
    'name':'Tom',
    'age':'20',
    'gender':'male'
    }
print(d['name'],d['age'],d['gender'])

打印

Tom 20 male

四、字典的使用

1.len()

获取字典的长度即字典中键值对的个数

d = dict([('name','Tom'),('age',20)])
print(len(d))

结果为2

2.in、not in

检查字典中是否含有或不含有指定的键

d = dict([('name','Tom'),('age',20)])
print('hello' in d)

打印

False

3.获取字典里面的值

语法:d[key]

d = dict([('name','Tom'),('age',20)])
print(d['name'])

打印

Tom

如将键赋值给一个变量,则通过变量访问时不需要引号

d = {'name':'Tom','age':'20','gender':'male'}
b = 'name'
print(d[b])

打印

Tom

如果键不存在会报错,即KeyError

d = {'name':'Tom','age':'20','gender':'male'}
print(d['hello'])

打印

KeyError: 'hello'

如避免异常,可以用get()方法
语法:get([,default])
根据键来获取字典中的值,也可以指定一个默认值,作为第二个参数,这样当获取不到键的时候会返回默认值。

d = {'name':'Tom','age':'20','gender':'male'}
print(d.get('hello','no such key'))

打印

no such key

4.修改字典

语法:d[key] = value
如果存在则覆盖,不存在则添加

d = {'name':'Tom','age':'20','gender':'male'}
d['name'] = 'Jerry'
d['phone'] = '010-11111111'
print(d)

打印

{'name': 'Jerry', 'age': '20', 'gender': 'male', 'phone': '010-11111111'}

5.setdefault()函数

可以向字典当中添加key-value
如果key已经存在于字典中,则返回key的值,不会对字典做任何操作;
如果key不存在,则向字典中添加这个key,并设置value。
key存在时,

d = {'name':'Tom','age':'20','gender':'male'}
result = d.setdefault('name','Jerry')
print(d,result)

打印

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

key不存在时,

d = {'name':'Tom','age':'20','gender':'male'}
result = d.setdefault('phone','010-11111111')
print(d,'\n',result)

打印

{'name': 'Tom', 'age': '20', 'gender': 'male', 'phone': '010-11111111'} 
 010-11111111

6.update()函数

将其他字典中的key-value添加到当前的字典中

d1 = {'a':1,'b':2,'c':3}
d2 = {'d':4,'e':5,'f':6}
d1.update(d2)
print(d1)

打印

{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}

如存在相同的键,则覆盖

d1 = {'a':1,'b':2,'c':3}
d2 = {'b':4,'e':5,'f':6}
d1.update(d2)
print(d1)

打印

{'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}

7.删除

方式一:del()

删除字典中的key和value

d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
del d['a']
del d['b']
print(d)

打印

{'c': 3, 'e': 5, 'f': 6}

方式二:d.popitem()

随机删除字典中的一个键值对,一般情况会删除最后一个键值对。
删除之后会将key-value作为返回值,返回值为元组。

d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
result = d.popitem()
print('result =',result)
print(d)

打印

result = ('f', 6)
{'a': 1, 'b': 4, 'c': 3, 'e': 5}

方式三:d.pop([,default])

根据keyshanchu字典中的键值对,返回的是被删除的value值

d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
result = d.pop('b')
print('result =',result)
print(d)

打印

result = 4
{'a': 1, 'c': 3, 'e': 5, 'f': 6}

如被删除不存在的键,则报错

d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
result = d.pop('z')
print('result =',result)
print(d)

抛出异常:KeyError: 'z'
可以通过在pop中添加第二个参数指定默认值,如果指定,当删除不存在的键时,会返回默认值。

d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
result = d.pop('z','no such key')
print('result =',result)
print(d)

打印

result = no such key
{'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}

方式四:d.clear()

用来清空字典

d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
d.clear()
print(d)

结果为:{}

浅复制(浅拷贝)

copy():用于将字典浅复制,即创建已有字典的副本

d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
d2 = d
print(d,id(d))
print(d2,id(d2))

打印

{'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 1997496449288
{'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 1997496449288

d和d2指向同一个对象。
当d中的值改变时,d2中的值也随之改变。

d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
d2 = d
d['a'] = 7
print(d,id(d))
print(d2,id(d2))

打印

{'a': 7, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2121296378120
{'a': 7, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2121296378120

用copy()方法:

d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
d2 = d.copy()
print(d,id(d))
print(d2,id(d2))

打印

{'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 3102906251528
{'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 3102906251608

d和d2指向不同对象。
当d中的值改变时,d2中的值不会改变。

d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
d2 = d.copy()
d['a'] = 7
print(d,id(d))
print(d2,id(d2))

打印

{'a': 7, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2430767003912
{'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2430767003992

当字典的值为字典时,

d = {'a': {'name':'Tom','age':'20','gender':'male'}, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
d2 = d.copy()
print(d,id(d))
print(d2,id(d2))

打印

{'a': {'name': 'Tom', 'age': '20', 'gender': 'male'}, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2220628113672
{'a': {'name': 'Tom', 'age': '20', 'gender': 'male'}, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2220628114392

当d中的值的值改变时,

d = {'a': {'name':'Tom','age':'20','gender':'male'}, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
d2 = d.copy()
d['a']['name'] = 'Jerry'
print(d,id(d))
print(d2,id(d2))

打印

{'a': {'name': 'Jerry', 'age': '20', 'gender': 'male'}, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2104435669336
{'a': {'name': 'Jerry', 'age': '20', 'gender': 'male'}, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2104435670056

复制:即创建已有对象的副本,则原对象改变,副本应该不发生改变,这才是正常的复制。
修改d时,d中的’a’下的’name’的值也发生了改变,此即浅复制,只会复制字典本身,字典中还有字典不会被复制。
总结:浅复制只会复制字典本身,如果字典中还有字典,是不会被复制的

七、遍历字典

1.方式一:keys()

该方法会返回字典所有的键。

d = {'name':'Tom','age':'20','gender':'male'}
for key in d.keys():
    print(d[key])

打印

Tom
20
male

2.values()

返回一个序列,保存字典的值

d = {'name':'Tom','age':'20','gender':'male'}
for value in d.values():
    print(value)

打印

Tom
20
male

3.items()

返回字典中所有的项,会返回一个序列,序列中包含双值子序列,双值分别为字典中的key-value。

d = {'name':'Tom','age':'20','gender':'male'}
for key,value in d.items():
    print(key,'=',value)

打印

name = Tom
age = 20
gender = male     

猜你喜欢

转载自blog.csdn.net/CUFEECR/article/details/102772574
今日推荐