Python

Python 知识量:10 - 41 - 150

7.3 列表><

列表的基本概念- 7.3.1 -

列表与元组一样,也是序列,但不同的是:列表是可变的。可变意味着,在创建了一个列表后,可以直接修改该列表的元素,添加、删除、覆盖原有元素都是可以的。正因列表如此灵活,所以,在编程中其比元组使用率高得多。

在结构上,列表用方括号括起来表示,其中的每个元素用逗号分割。与元组一样,列表的元素可以是任何Python值,包含另一个列表也是可以的。空列表用[]表示,单元素列表(即:只含有一个元素的列表)写做:[x],这里与元组不同,单元素后面不用加逗号。下面是一些列表的示例:

>>> number=[1,2,3,4,5]
>>> number2=[6,7,8,9,10]
>>> len(number)
5
>>> number+number2
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> number*2
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
>>> number[2]
3
>>> number[-3:]
[3, 4, 5]
>>> type([])   # 检查一个空列表类型
<class 'list'>
>>> type([7])  # 检查一个单元素列表类型
<class 'list'>

列表可变- 7.3.2 -

可以利用列表可变性,轻松的修改其元素,例如:

>>> number=[1,2,3,4,5]
>>> number
[1, 2, 3, 4, 5]
>>> number[0]=0
>>> number
[0, 2, 3, 4, 5]

赋值后的Python变量总是指向一个值,而不是包含一个值,列表元素也是一样的。因此,如上所示,当改变number[0]的值时,实际上是将number[0]由指向1修改为指向0,原来的值1因为没有变量指向它了,将会被系统回收清理掉。

理解了以上细节,就可以明白,其实列表元素也可以指向列表本身,从而创建一个自引用的数据结构,如下所示:

>>> box=[1,2,3,4,5]
>>> box[2]=box
>>> box
[1, 2, [...], 4, 5]

Python可以识别自引用,不会无限打印列表,而是使用[...]来表示自引用。

列表函数- 7.3.3 -

Python提供的常用列表函数如下表所示:

函数名功能说明
s.append(x)在列表s的末尾添加元素x。
s.count(x)返回元素x在列表s中出现的次数。
s.extend(part)将part作为序列添加到列表s的末尾。
s.index(x)返回元素x在列表s中第一次出现的位置的索引。
s.insert(i,x)将元素x插入到索引i指向的列表s的元素前面。
s.pop(i)删除并返回列表s中索引i指向的元素。
s.remove(x)删除列表s中的第一个x元素。
s.reverse()反转列表s中元素的排列顺序。
s.sort()将列表s的元素按升序排列。

1、在列表末尾添加元素。

许多编程语言中都有“栈”的概念,在列表末尾添加元素也可以称为在栈顶压入元素,一般用push表示,在Python中使用函数append()来实现push。

# list.py
def list(ls):
    message=[]
    for number in ls:
        if number < 0:
            s=str(number)+' is a negative number'
        elif number >= 0:
            s=str(number)+' is a natural number'
        message.append(s)
    return message

运行结果为:

>>> 
====================== RESTART: D:\PythonTestFile\list.py ======================
>>> list([1,69,-9,0,-56])
['1 is a natural number', '69 is a natural number', '-9 is a negative number',
 '0 is a natural number', '-56 is a negative number']

在函数list中,先创建了一个空列表,然后根据判断条件陆续在列表末尾插入元素。如果想要逐行打印结果列表的每个元素,可以这样做:

>>> print('\n'.join(list([1,69,-9,0,-56])))
1 is a natural number
69 is a natural number
-9 is a negative number
0 is a natural number
-56 is a negative number

2、在列表末尾添加序列。

函数extend()与函数append()功能类似,但它用于在列表末尾添加一个序列。下面的示例显示了函数extend()与append()的差异:

>>> ls=[]
>>> ls.extend('abc')
>>> ls
['a', 'b', 'c']
>>> ls2=[]
>>> ls2.append('abc')
>>> ls2
['abc']

3、删除并返回指定索引对应的列表元素。

对于“栈”的概念,与压入(push)对应的术语称为弹出(pop),Python中同样使用函数pop()来实现这个功能。

>>> ls=[1,2,3,4,5]
>>> ls.pop(2)
3
>>> ls
[1, 2, 4, 5]
>>> ls.pop()
5
>>> ls
[1, 2, 4]
>>> ls.pop()
4
>>> ls
[1, 2]

除了指定弹出的元素索引外,如果不给出参数,函数pop()默认弹出列表最后一个元素。

4、仅删除指定索引对应的列表元素。

函数remove(x)与pop(x)功能相似,但函数remove(x)不返回删除的元素,而且必须指定要删除元素的索引值,否则会引发TypeError异常。

>>> ls=[1,2,3,4,5]
>>> ls.remove(2)
>>> ls
[1, 3, 4, 5]
>>> ls.remove()
Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    ls.remove()
TypeError: remove() takes exactly one argument (0 given)

5、反转列表元素的排列顺序。

函数reverse()用于反转列表元素的排列顺序,它不会创建列表的拷贝,而是直接删除列表元素,并指向排序后的新值。

>>> ls=[1,2,3,4,5]
>>> ls
[1, 2, 3, 4, 5]
>>> ls.reverse()
>>> ls
[5, 4, 3, 2, 1]