列表
“列表”是一个值,它包含多个字构成的序列。术语“列表值”指的是列表本身(它作为一个值,可以保存在变量中,或传递给函数,像所有其他值一样),而不是指列表值之内的那些值。列表值看起来像这样:['cat', 'bat', 'rat', 'elephant'] 。就像字符串值用引号来标记字符串的起止一样,列表用左方括号开始,右方括号结束,即[]。列表中的值也称为“表项”。表项用逗号分隔(就是说,它们是“逗号分隔的”)。变量只能被赋予一个值:列表值。但列表值本身包含多个值([ ] 是一个空列表,不包含任何值,类似于空字符串’’)。
假定列表 ['cat', 'bat', 'rat', 'elephant'] 保存在名为 spam 的变量中。Python 代码 spam[0] 将求值为 'cat',spam[1] 将求值为 'bat',依此类推。列表后面方括号内的整数被称为“下标”。列表中第一个值的下标是 0,第二个值的下标是 1,第三个值的下标是 2,依此类推。就像C语言中的数组一样。
spam = ['cat', 'bat', 'rat', 'elephant']
print(spam)
print('The three char: ' + spam[2])
列表值可以赋值给变量,通过下标可以选择对应的列表内的值,结果如下:
注意:
如果下标超限会报错;
下标只能是整数;
下标可以是负数,-1就是最后一个;
列表中的值可以是数值或者字符串,也可以是列表值;
切片相当于获取多个连续的列表中的值,例如spam[1:3],会得到(3-1)个值;
若切片没有开始值就是从0开始,例如spam[:3],会得到(3-0)个值;
len() 函数可以获取列表中值的个数;
可以给列表中的值通过赋值修改;
字符串的连接和复制适用于列表(+和*);
del语句可以删除列表中的值;
测试代码如下:
rainbow = [['red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple'], [1, 2, 3, 4, 5, 6, 7]]
num = rainbow[1][1:4]
color = rainbow[0][num[1]-1]
print(color)
print(num)
利用 in 和 not in 操作符,可以确定一个值否在列表中。像其他操作符一样,in 和 not in 用在表达式中,连接两个值:一个要在列表中查找的值,以及待查找的列表。这些表达式将求值为布尔值。这一点就比C语言的方便的多,不用再挨个比较了,直接就会出结果。
在变量的数目和列表的长度严格相等时可以使用多重复制的方法:
cat = ['fat', 'black', 'loud']
size, color, disposition = cat
print('fat' not in cat)
print('fat' in cat)
print(size)
对于变量可以使使用数学操作符进行增强赋值:
方法和函数是一回事,只是它是调用在一个值上。例如,如果一个列表值存储在 spam 中,你可以在这个列表上调用 index() 列表方法(稍后我会解释),就像 spam.index('hello') 一样。方法部分跟在这个值后面,以一个句点分隔。每种数据类型都有它自己的一组方法。例如,列表数据类型有一些有用的方法,用来查找、添加、删除或操作列表中的值:
index() :可以传入一个值,如果该值存在于列表中,就返回它的首次出现的下标。如果该值不在列表中,Python 就报 ValueError;
append() :将参数添加到列表末尾,spam.append('moose');
insert():第一个参数是新值的下标,第二个参数是要插入的新值,spam.insert(1, 'chicken');
remove():传入一个值,它将从被调用的列表中删除(第一次出现),列表中不存在的值,将导致 ValueError 错误;
sort() :数值的列表或字符串的列表,能用 sort() 方法排序,spam.sort(reverse=True)为逆向排序,注意排序内容为同一类型;
注意:字符串可以看成列表进行操作,把它的值看成是一个个字符,不过字符串和列表有一个本质上的区别,列表可以更改,字符串不可以更改(要想更改只能切片在通过“+”连接)。
“元组”数据类型几乎与列表数据类型一样。首先,元组输入时用圆括号(),而不是用方括号[]。元组与列表的主要区别还在于,元组像字符串一样,是不可变的。如果元组中只有一个值,你可以在括号内该值的后面跟上一个逗号(type(('hello',))),表明这种情况,没有逗号就是字符串了。
函数 list() 和 tuple() 将返回传递给它们的值的列表和元组,如果逆向修改元组数据可以先通过 list()转换成列表进行修改,然后在通过 tuple() 转换成元组。 我们在进行列表对变量的赋值时,就像数组和指针,变量存储的是列表的引用,这个时候将这个变量给到新的变量,我们在修改新变量对应的列表时,相当于两个变量的引用都被修改了。例如:
spam = [0, 1, 2, 3, 4, 5]
cheese = spam
cheese[1] = 'Hello!'
print(spam)
print(cheese)
如果想要产生一个新的列表需要用到copy 模块的 copy() 和 deepcopy() 函数,copy()用于复制列表,而不只是复制引用;要是复制的列表中包含了列表,那就使用 copy.deepcopy() 函数来代替。deepcopy() 函数将同时复制它们内部的列表,也就是说内部不再有列表。
import copy
spam = ['A', 'B', 'C', 'D']
cheese = copy.copy(spam)
cheese[1] = 42
print(spam)
print(cheese)
spam1 = [['A', 'B'], 'C', 'D']
cheese1 = copy.deepcopy(spam)
print(spam1)
print(cheese1)
字典
像列表一样,“字典”是许多值的集合。但不像列表的下标,字典的索引可以使用许多不同数据类型,不只是整数。字典的索引被称为“键”,键及其关联的值称为“键-值”对。字典输入时带花括号 {},例如myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'},“:”前面的是键,相当于自定义了一个下标,可以用任意值作为键。字典中的表项是不排序的,不能像列表那样切片不过。
有 3 个字典方法,它们将返回类似列表的值,分别对应于字典的键、值和键-值对: keys():获取键;values() :获取值;items():获取值键-值对
spam = {'color': 'red', 'age': 42}
a = spam.values()
print(a)
for v in spam.values():
print(v)
for z in spam.keys():
print(z)
for x in spam.items():
print(x)
这些方法返回的值不是真正的列表,它们不能被修改,没有 append() 方法,打印的表达方式要不是字符串,要不是元组。但这些数据类型(分别是 dict_keys、dict_values 和 dict_items)可以用于 for 循环。for 循环迭代了 spam 字典中的每个值。for 循环也可以迭代每个键,或者键-值对。想要转换成可修改的使用list 函数。
in 和 not in 可用于字典中查询是否存在,我们在想要获取可以使用get() 方法,如果有就获取,没有就输出备用值,有两个参数:要取得其值的键,以及如果该键不存在时,返回的备用值。setdefault() 方法提供了一种方式,在一行中完成这件事。传递给该方法的第一个参数,是要检查的键。第二个参数,是如果该键不存在时要设置的值。如果该键确实存在,方法就会返回键的值。
message = 'It was a bright'
count = {}
for character in message:
count.setdefault(character, 0)
count[character] = count[character] + 1
print(count)
print(count.get(' ', 9))
print(count.get('x', 9))
上边可以看到字典中键值对如果很多的话为看着不美观,可以使用程序中导入 pprint 模块,就可以使用 pprint() 和 pformat()函数,它们将“漂亮打印”一个字典的字。
列表和字典都可以包含多个值,包括其他列表和字典。字典可以把一些项(键)映射到另一些项(值),它不像列表,只包含一系列有序的值。字典中的值是通过方括号访问的,像列表一样。字典不是只能使用整数下标,而是可以用各种数据类型作为键:整型、浮点型、字符串或元组。