列表是python中常用的数据类型,方便好用,对于我们初步学习以及主要用于制作自己的实用小工具的目的来说相当友好。列表具有相当完善的功能,所以单列一小章记录一下。
列表的定义与赋值
<code>spam = ['cat', 'bat', 3.1415926,'rat', 'elephant']
spam_empty = []/<code>
列表的定义如上所示。列表的成员变量类型可不唯一,如上例中所定义的第一个列表中,既有字符串又有double类型。
第二个列表为空列表。
下标取值
1.正数下标
列表中的值,可通过列表下标来获取。具体看示例代码:
<code>spam = ['cat', 'bat', 3.1415926,'rat', 'elephant']
print(spam[0])
#cat
print(spam[1])
#bat
print(spam[2])
#3.1415926
print(spam[3])
#rat
print(spam[4])
#elephant
print('hello '+spam[3])
#hello rat/<code>
多重列表的下标取值:
<code>spam = [['cat', 'bat'], 3.1415926,'rat', 'elephant']
print(spam[0])
#['cat', 'bat']
print(spam[0][1])
#bat/<code>
2.负数下标
虽然下标从 0 开始并向上增长,但也可以用负整数作为下标。整数值−1 指的是 列表中的最后一个下标,−2 指的是列表中倒数第二个下标,以此类推
切片获取子列表
就像下标可以从列表中取得单个值一样,“切片”可以从列表中取得多个值, 结果是一个新列表。切片输入在一对方括号中,像下标一样,但它有两个冒号分隔的整数。请注意下标和切片的不同。
spam[2]是一个列表和下标(一个整数)。
spam[1:4]是一个列表和切片(两个整数)。
在一个切片中,第一个整数是切片开始处的下标。第二个整数是切片结束处的下标。切片向上增长,直至第二个下标的值,但不包括它。切片求值为一个新的列表值。
作为快捷方法,你可以省略切片中冒号两边的一个下标或两个下标。省略第一 个下标相当于使用 0,或列表的开始。省略第二个下标相当于使用列表的长度,意味着分片直至列表的末尾。
<code>spam = [['cat', 'bat'], 3.1415926,'rat', 'elephant']
print(spam[0:3])
#[['cat', 'bat'],3.1415926,'rat']
print(spam[0:-2])
#[['cat', 'bat'],3.1415926]
print(spam[:2])
#[['cat', 'bat'],3.1415926]
print(spam[1:])
#[3.1415926,'rat', 'elephant']
print(spam[:])
#[['cat', 'bat'], 3.1415926,'rat', 'elephant'] /<code>
len()函数获取列表长度
len()函数将返回传递给它的列表中值的个数,就像它能计算字符串中字符的个数一样。
列表成员赋值:可使用下标直接对指定成员赋值
+操作符可以连接两个列表,得到一个新列表,就像它将两个字符串合并成一个新字符串一样。*操作符可以用于一个列表和一个整数,实现列表的复制。
del 语句将删除列表中下标处的值,表中被删除值后面的所有值,都将向前移动一个下标。
<code>spam = [['cat', 'bat'], 3.1415926,'rat', 'elephant']
print(spam[:])
#[['cat', 'bat'], 3.1415926,'rat', 'elephant']
del spam[2]
print(spam[:])
#[['cat', 'bat'], 3.1415926, 'elephant']
del spam[0][1]
print(spam[:])
#[['cat'], 3.1415926, 'elephant'] /<code>
in和not in
利用 in 和 not in 操作符,可以确定一个值否在列表中。像其他操作符一样,in 和 not in 用在表达式中,连接两个值:一个要在列表中查找的值,以及待查找 的列表。这些表达式将求值为布尔值。
<code>spam = [['cat', 'bat'], 3.1415926,'rat', 'elephant']
print(str('rat' in spam))
#true
print(str(['cat', 'bat'] in spam))
#true
print(str('ppp' in spam))
#false
#not in 用法相同/<code>
列表方法
1. index()
<code>spam = ['Zophie', 'Pooka', 'Fat-tail', 'Pooka']
spam.index('Pooka')
#1
#返回指定值下标,如果有重复,返回第一个的坐标/<code>
2.用 append()和 insert()方法在列表中添加值
append()方法调用,将参数添加到列表末尾。
<code>spam = ['cat', 'dog', 'bat']
spam.append('mouse')
#spam = ['cat', 'dog', 'bat','mouse']/<code>
insert()方法可以在列表任 意下标处插入一个值。insert()方法的第一个参数是新值的下标,第二个参数是要插 入的新值。
<code>spam = ['cat', 'dog', 'bat']
spam.insert(1, 'chicken')
#spam = ['cat', 'chicken', 'dog', 'bat']/<code>
3. 用 remove()方法从列表中删除值
<code>spam = ['cat', 'bat', 'rat', 'elephant']
spam.remove('bat')
#spam = ['cat','rat', 'elephant'] /<code>
如果该值在列表中出现多次,只有第一次出现的值会被删除。
如果知道想要删除的值在列表中的下标,del 语句就很好用。如果知道想要从列表中删除的值,remove()方法就很好用。
4. sort()可用于列表排序,按数字大小或字母排序,详细情况可查看相关资料
可变数据和不可变数据类型:字符串和元组
字符串可以视为单个字符的列表,不过不同的是,列表可以对列表中的单个数据进行赋值,而字符串不可以。比如:
<code>strs = 'pool'
print(strs[0])
#p
strs[2] = 'u'
#程序将出错
strs = 'poul'
#没问题/<code>
可以为字符串变量赋值,但不能用赋值改变字符串的内容本身。这就是可变数据与不可变数据类型。
列表的不可变数据版本就是元组。元组定义时使用圆括号,其他下标、切片操作与列表相同。如果元组中只有一个值,你可以在括号内该值的后面跟上一个逗号,表明这种情况。否则,Python 将认为,你只是在一个普通括号内输入了一个值。逗号告诉 Python,这是一个元组
<code>eggs = ('hello', 42, 0.5)
eggs = ('hello', )/<code>
可以使用 list()和 tuple()函数来转换类型
引用
列表等可变数据类型保存的是列表数据的引用,而非列表数据本身,即可理解为指针。
spam = [2,3,4]
中,spam本身不保存[2,3,4]这个值,而是保存这个值的编号,可理解为C中的指针。因此,将列表等可变数据类型作为函数参数,如apppp(list)函数,将改变列表数据值本身。也就是相当于C中的传引用,而非传值。
那么,如果使用列表直接赋值,会出现以下情况:
<code> >>> spam = [0, 1, 2, 3, 4, 5]
>>> cheese = spam
>>> cheese[1] = 'Hello!'
>>> spam
[0, 'Hello!', 2, 3, 4, 5]
>>> cheese
[0, 'Hello!', 2, 3, 4, 5]/<code>
列表的复制
要复制列表,可使用python的copy模块。copy.copy(),可以用来复制列表或字典这样的可变值,而不只是复制引用。如果要复制的列表中包含了列表,那就使用 copy.deepcopy()函数来代替。
閱讀更多 阿偉的學習小站 的文章