5、元组、字典

2018-03-19  本文已影响43人  甜西瓜不太甜

Lesson_5


【1】元组(牢笼中的的列表)

元组 tuple

我们这里说的元组不是那个赫赫有名的元组零食、元组蛋糕。

能力越大的人都有可能滥用权力,反而导致自身万劫不复。

同样,因为列表过于强大,python的作者发明了它的表亲---元组。

元组和列表的最大区别就是,元组里面的数据是不可动的。

访问和创建一个元组

元组和列表,除了不可变这个特征意外,那就是list用的中括号,tuple用的是小括号


tuple1 = ()

tuple2 = (1,) #只有一个元素的时候一定要在结尾加上一个逗号,不加上逗号就是number

tuple3 = (1,2,3)

print('tuple1:',tuple1,type(tuple1))
print('tuple2:',tuple2,type(tuple2))
print('tuple3:',tuple3,type(tuple3))

#tuple1: () <class 'tuple'>
#tuple2: (1,) <class 'tuple'>
#tuple3: (1, 2, 3) <class 'tuple'>

另类定义:


tuple1 = 1,  #number加上逗号就是tuple,不加就是数字

tuple2 = 1,2,3


print('tuple1:',tuple1,type(tuple1))
print('tuple2:',tuple2,type(tuple2))

#tuple1: (1,) <class 'tuple'>
#tuple2: (1, 2, 3) <class 'tuple'>

我们尝试一下不带逗号会怎么样:

tuple1 = (1)

tuple2 = (1,)

print(tuple1 * 3)
print(tuple2 * 3)

#3
#(1, 1, 1)

访问tuple的索引和list是一样的:

tuple1 = ((1,2,3),4,(5,6,7),[1,2,3])
#二维的元组,可以嵌套多类型的数据

print(tuple1[0][0])
print(tuple1[1])
print(tuple1[3][2])

#1
#4
#3

tuple也是可以切片的:

tuple1 = 1,2,3,4,5,6,7,8,9

print(tuple1[:5])  #从0开始取列表中钱5个元素
print(tuple1[-1])  #查找最后一个元素
print(tuple1[::2]) #隔2个查一次
print(tuple1[::-1]) #返回翻转的结果

#(1, 2, 3, 4, 5)
#9
#(1, 3, 5, 7, 9)
#(9, 8, 7, 6, 5, 4, 3, 2, 1)

tuple的元素是不可变的:

修改:


tuple1 = 1,2,3,4,5,6,7,8,9

tuple1[0] = 0

print(tuple1)

#TypeError: 'tuple' object does not support item assignment

删除:


tuple1 = 1,2,3,4,5,6,7,8,9

del tuple1[-1]

print(tuple1)

#TypeError: 'tuple' object does not support item assignment

更新和删除元组

修改

前面说过了,元组的元素具有不可变性,那么有没有其它办法了?

我们可以通过合并的方式向元组的尾部或者头部插入数据


tuple1 = '成龙','李连杰','李小龙'

name1 = '梁小龙',  

name2 = '元彪','洪金宝'

tuple1 = tuple1 + name1 #通过拼接在重新赋值给 tuple1

tuple1 = name2 + tuple1

print(tuple1)


#('元彪', '洪金宝', '成龙', '李连杰', '李小龙', '梁小龙')

#注意:拼接只能是同类型之间拼接

得到结论,元组要修改就必须要重新赋值。

删除元组

删除元组的元素我们在上面的内容已经尝试过了,是不可实现的。

元组的删除和修改差不多,要删就全删。


tuple1 = '成龙','李连杰','李小龙'

del tuple1

返回指定值得下标


tuple1 = '成龙','李连杰','李小龙'


print(tuple1.index('成龙'))

#0

返回元组的个数


tuple1 = '成龙','李连杰','李小龙'

print(len(tuple1))

#3

返回元组中的最大值和最小值


tuple1 = 1,2,3,4,5,6,7


print(max(tuple1))
print(min(tuple1))

#7
#1

返回数组的和


tuple1 = 1,2,3,4,5,6,7

tuple1 = 1,2,3,4,5,6,7

print(sum(tuple1))


#28

将元组转成列表


tuple1 = 1,2,3,4,5,6,7

print(list(tuple1))

#[1, 2, 3, 4, 5, 6, 7]

将其它类型转成tuple


list1 = [1,2,3,4,5,6,7]

string = '123344'

print(tuple(list1))
print(tuple(string))

#(1, 2, 3, 4, 5, 6, 7)
#('1', '2', '3', '3', '4', '4')

#number 和 bool 类型的值是不可迭代的,所以不能转换

元组的遍历


tuple1 = [1,2,3,4,5,6,7]

for i in tuple1:
    print(i)

【2】string补充

字符串我们在前面的内容里面已经学过不少了,想必大家消化的差不多了,
我们今天再来一波新的用法。

splitlines([keepends]) 多行分割

默认keepends = false的,表示不保留换行符

str40 = '''sunck is a good man!
sunck is a nice man!
sunck is handsome man!
'''
print(str40.splitlines(True))

#['sunck is a good man!\n', 'sunck is a nice man!\n', 'sunck is handsome man!\n']

max()、min()

max()、min()可以判断字符串大小值


str1 = "abcdefg!"
print(max(str1))
print(min(str1))

#g
#!

<image src='images/timg.jpeg'/>

创建字符映射的转换表

str.maketrans(intab, outtab) 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。

str1 = str.maketrans("ac", "65")

print(str1)

#{97: 54, 99: 53}

过滤字符映射

translate() 方法根据参数table给出的表(包含 256 个字符)转换字符串的字符,要过滤掉的字符放到 deletechars 参数中。

str.translate(table, deletechars)

table -- 翻译表,翻译表是通过 maketrans() 方法转换而来。
deletechars -- 字符串中要过滤的字符列表。

例如:


intab = "aeiou"
outtab = "12345"
trantab = str.maketrans(intab, outtab)  # 制作翻译表

str = "this is string example....wow!!!"
print(str.translate(trantab))

#th3s 3s str3ng 2x1mpl2....w4w!!!

编码

encode() 方法以 encoding 指定的编码格式编码字符串。errors参数可以指定不同的错误处理方案。

encoding -- 要使用的编码,如"UTF-8"。

errors -- 设置不同错误的处理方案。默认为 'strict',意为编码错误引起一个UnicodeError。 其他可能得值有 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 以及通过 codecs.register_error() 注册的任何值。

看个例子:


str1 = "这是一个字符串"
#ignore忽略错误
data2 = str1.encode("utf-8", "ignore")
print(data2)
print(type(data2))

#解码  注意:要与编码时的编码格式一致
str3 = data2.decode("gbk", "ignore")
print(str3)


#b'\xe8\xbf\x99\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xaa\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'
#<class 'bytes'>
#杩欐槸涓涓瀛楃︿覆

字符判断

isalpha()

如果字符串中至少有一个字符且所有的字符都是字母返回True,否则返回False

str1 = "abcde"
print(str1.isalpha())

>>>True
isalnum()

如果字符串中至少有一个字符且所有的字符都是字母或数字返回True,否则返回False


str1 = "1a2b3"
print(str1.isalnum())

>>>True
isspace()

如果字符中只包含空格则返回True,否则返回False


print(" ".isspace())
print("      ".isspace())
print("\t".isspace())
print("\n".isspace())
print("\r".isspace())

【3】字典(dict)

我们在翻开《新华字典》的时候想查一个字的时候,比如“万“,我们不会从‘a’到‘z’开始逐个查找,而是直接从‘w’开始,接着找wan这个发音,最终找个”万“字。

python中的字典类型会把‘wan’看着是 键(key),”万“字看着是值(value),另外python中的 dict在有些地方称为哈希(hash),有些地方称为 关系数组,也和javascript 的轻量数据交换格式(json)是一样的。

用键-值(key-value)存储,具有极快的查找速度

<font color='red'>注意:字典是映射关系,字典不能被切片</font>

key的特性:

1、字典中的key必须唯一
2、key必须是不可变对象
3、字符串、整数等都是不可变的,可以作为key
4、list是可变的,不能作为key
字典是Python语言中唯一的映射类型。
映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表。
字典对象是可变的,它是一个容器类型,能存储任意个数的Python对象,其中也可包括其他容器类型。
字典类型与序列类型的区别:
1.存取和访问数据的方式不同。
2.序列类型只用数字类型的键(从序列的开始按数值顺序索引);
3.映射类型可以用其他对象类型作键(如:数字、字符串、元组,一般用字符串作键),和序列类型的键不同,映射类型的键直接或间接地和存储数据值相关联。
4.映射类型中的数据是无序排列的。这和序列类型是不一样的,序列类型是以数值序排列的。
5.映射类型用键直接“映射”到值。
字典是Python中最强大的数据类型之一。

创建和访问dict

创建dict

字典在创建的时候必须是{'key':'value'}


dict1 = {}
dict2 = {'name':'tom','sex':'male','age':25}
dict3 = dict()
print(dict1,type(dict1))
print(dict2,type(dict2))
print(dict3,type(dict3))

#{} <class 'dict'>
#{'name': 'tom', 'sex': 'male', 'age': 25} <class 'dict'>
#{} <class 'dict'>
访问dict

访问dict必须要指定它的key


dict1 = {'name':'tom','sex':'male','age':25}

print(dict1['name'])

#tom
添加一个新的值

dict1 = {'name':'tom','sex':'male','age':25}
dict1['height'] = '175cm'
print(dict1)

#{'name': 'tom', 'sex': 'male', 'age': 25, 'height': '175cm'}

修改指定的值

dict1 = {'name':'tom','sex':'male','age':25}
dict1['age'] = '30'
print(dict1)

#{'name': 'tom', 'sex': 'male', 'age': '30'}
删除指定的值

dict1 = {'name':'tom','sex':'male','age':25}

dict2 = dict1.copy()

dict3 = dict1.copy()

del dict1['age']        #直接删除

print(dict2.pop('sex')) #弹出一个指定的键,并返回被弹出的值

print(dict3.popitem())  #弹出最后一项,并返回被弹出的值

print(dict1)
print(dict2)
print(dict3)

#male
#('age', 25)
#{'name': 'tom', 'sex': 'male'}
#{'name': 'tom', 'age': 25}
#{'name': 'tom', 'sex': 'male'}
深度拷贝dict

dict1 = {'name':'tom','sex':'male','age':25}

dict2 = dict1.copy()  

dict3 = dict1

dict1.pop('age')

print(id(dict1),dict1)
print(id(dict2),dict2)
print(id(dict3),dict3)

#4303185888 {'name': 'tom', 'sex': 'male'}
#4303185960 {'name': 'tom', 'sex': 'male', 'age': 25}
#4303185888 {'name': 'tom', 'sex': 'male'}
清除dict

dict.clear()

不管是list还是dict,清除都建议使用clear(),为什么了?举个例子

dict1 = {'name':'tom','sex':'male','age':25}

dict2 = dict1

dict1 = {}

print(id(dict1),id(dict2))
print(dict1,dict2)

#4301088808 4301088736
#{} {'name': 'tom', 'sex': 'male', 'age': 25}

上面的例子中 dict1 = {} 并没有把内存中的值给去除, 而是从新定义了一个 空dict,把指针指向了另一个地址.

dict2是浅拷贝dict1的,那么原来的值还在内存中。这样做的弊端就是浪费内存的使用空间。

使用clear()试一下

dict1 = {'name':'tom','sex':'male','age':25}

dict2 = dict1

print(id(dict1),id(dict2))  #这是清理之前的内存地址

dict1.clear()

print(id(dict1),id(dict2))

print(dict1,dict2)


#4301088736 4301088736
##4301088736 4301088736
{} {}

使用clear()以后两个被一起清理了,而且是在原内存空间上做清理的。

所以不论是list、dict都建议使用.clear()

修改dict

dict1 = {'name':'tom','sex':'male','age':25}

dict1['age'] = 26

dict1.update(sex = 'female')

dict1['cname'] = '汤姆'       #指定key可以修改也可以添加

dict1.update(height = '170')  #height并不存在

print(dict1)

#{'name': 'tom', 'sex': 'female', 'age': 26, 'cname': '汤姆', 'height': '170'}

上面的例子我们能看出来.update()和指定key的效果是一样的,如果指定的 键值对 已经存在 则修改,不存在 则添加

<font color='red'>注意:update(key = ‘value’)中key是不带引号的,而value是带引号的,除非它是整数</font>

宽松访问

get()方法提供了更加合适的访问方式。


dict1 = {'name':'tom','sex':'male','age':25}

print(dict1.get('age'))

print(dict1.get('height'))

print(dict1.get('height','not find'))

#25            找到对应的key则返回value
#None          没有找到key返回None
#not find      如果设置第二个参数,找到key返回对应的value,没有找到返回设定的默认值

相同的,可以用 in 和 not in 判断是否在dict里面,但是只能用key作为查找条件

dict1 = {'name':'tom','sex':'male','age':25}

print('name' in dict1)

#True
其它方式创建dict

fromkeys()用于创建一个新的字典,它有两个参数,第一个参数是字典的 键 ,第二个参数是可选的,是传入键的对应值,第二个参数不写的话,值默认是None。

<font color='red'>注意:第一个参数必须是可迭代的序列,在我们python中可迭代的序列中有三种,str,list,tuple。而且它是返回一个新的字典,并不会改变原来的值</font>


dict1 = {}
print(dict1.fromkeys('12','str'))
print(dict1.fromkeys([2,3],(1,2,3)))
print(dict1.fromkeys((5,6)))

#{'1': 'str', '2': 'str'}
#{2: (1, 2, 3), 3: (1, 2, 3)}
#{5: None, 6: None}

上面的例子告诉我们做事不能想当然,在第二个print()中并不会将(1,2,3)拆开,而是将他们当着一个值。

keys(),values(),items()

访问字典的方法还有keys(),values(),items()

keys()是返回字典中的所有键,values()是返回字典中的值,那么items()就是返回字典中的键值对。items()返回的是一个list,每个元素都是tuple。


dict1 = {'name':'tom','sex':'male','age':25}

print(dict1.keys())
print(dict1.values())
print(dict1.items())

#dict_keys(['name', 'sex', 'age'])
#dict_values(['tom', 'male', 25])
#dict_items([('name', 'tom'), ('sex', 'male'), ('age', 25)])

课堂小作业:

list1 = [('name', 'tom'), ('sex', 'male'), ('age', 25)]

我们将list转换成dict,不使用dict()。


list1 = [('name', 'tom'), ('sex', 'male'), ('age', 25)]

dict1 = {}

for each in list1:
    dict1[each[0]] = each[1]
print(dict1)

#{'name': 'tom', 'sex': 'male', 'age': 25}
上一篇 下一篇

猜你喜欢

热点阅读