List(列表)是Python内置的一种数据类型。List是一种有序的集合,可以随时添加和删除其中的元素。
比如,列出班里所有同学的名字,就可以用一个list表示:
>>> classmates = ['Bob', 'tracy', 'Jack', 'Judy']
>>> classmates
['Bob', 'tracy', 'Jack', 'Judy']
说明: 变量classmates就是一个list。
列表的相关操作如下:
(1)获取list的长度(即元素个数)
>>> len(classmates)
4
(2)用索引访问某个元素
>>> classmates[2]
'Jack'
>>> classmates[3]
'Judy'
>>> classmates[1]
'tracy'
>>> classmates[0]
'Bob'
>>> classmates[4]
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
classmates[4]
IndexError: list index out of range
说明: list的索引是从0开始算起,当索引超出了范围时,Python会报一个IndexError错误,所以,要确保索引不要越界,记得最后一个元素的索引是len(classmates) - 1 。
另外,如果我们要获取list的最后一个元素,也可以如下:
>>> classmates[-1]
'Judy'
同样,如果要获取倒数第2个,倒数第3个元素,倒数第4个元素,则:
>>> classmates[-2]
'Jack'
>>> classmates[-3]
'tracy'
>>> classmates[-4]
'Bob'
同样的要获取classmates中倒数第5个元素,也会报index越界的错误,如下:
>>> classmates[-5]
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
classmates[-5]
IndexError: list index out of range
(3)往列表中追加元素
>>> classmates.append('Adam')
>>> classmates
['Bob', 'tracy', 'Jack', 'Judy', 'Adam']
(4)在指定位置插入元素
>>> classmates.insert(0, 'Linda')
>>> classmates
['Linda', 'Bob', 'tracy', 'Jack', 'Judy', 'Adam']
>>> classmates.insert(3, '张三')
>>> classmates
['Linda', 'Bob', 'tracy', '张三', 'Jack', 'Judy', 'Adam']
(5)删除列表末尾的元素
>>> classmates.pop()
'Adam'
>>> classmates
['Linda', 'Bob', 'tracy', '张三', 'Jack', 'Judy']
(6)删除指定位置的元素
>>> classmates.pop(3)
'张三'
>>> classmates
['Linda', 'Bob', 'tracy', 'Jack', 'Judy']
(7)替换元素
>>> classmates[2] = 'Sarah'
>>> classmates
['Linda', 'Bob', 'Sarah', 'Jack', 'Judy']
(8)List中元素可以是不同类型,比如:
>>> L = ['apple', 123, True]
>>> L
['apple', 123, True]
(9)List也可以是某个List中的元素,如:
>>> L = ['apple', 123, ['Jack', 23, 'Shanghai'], True]
>>> L
['apple', 123, ['Jack', 23, 'Shanghai'], True]
即:
>>> P = ['Jack', 23, 'Shanghai']
>>> L = ['apple', 123, P, True]
>>> L
['apple', 123, ['Jack', 23, 'Shanghai'], True]
要获取到元素‘Jack’,则:
>>> L[2][0]
'Jack'
一些问题:
1. append() 方法和 extend() 方法都是向列表的末尾增加元素,请问他们有什么区别?
append() 方法是将参数作为一个元素增加到列表的末尾。
extend() 方法则是将参数作为一个列表去扩展列表的末尾。
name = ['D','o','g']
name.append('C')
print(name)
name.extend(['-','H'])
print(name)
name.append(['*','G'])
print(name)
返回结果:
2.打印列表
有列表 member = [‘张三’, 88, ‘李四’, 90, ‘王五’, 85, ‘刘二’, 90, ‘王大’, 88],打印出来:
方法1:
member = ['张三', 88, '李四', 90, '王五', 85, '刘二', 90, '王大', 88]
for each in member:
print(each)
打印结果:
感觉上面的打印结果不太美观,还可以这样打印:
# 方法1:
count = 0
length = len(member)
while count < length:
print(member[count], member[count+1])
count += 2
# 方法2:
for each in range(len(member)):
if each % 2 == 0:
print(member[each], member[each+1])
打印结果:
3. 请问 list[0] 和 list[0:1] 一样吗?
不一样,list[0] 返回第0个元素的值,list[0:1] 返回一个只含有第0个元素的列表。
例如:
member = ['张三', 88, '李四', 90, '王五', 85, '刘二', 90, '王大', 88]
print(member[0])
print(member[0:1])
打印结果:
4. 如果你每次想从列表的末尾取出一个元素,并将这个元素插入到列表的最前边,你会怎么做?
最简单的方法: list.insert(0,list.pop())
如:
list = ['b','c','d','a']
list.insert(0,list.pop())
print(list)
打印结果:
5. 列表的拷贝问题
我们可以利用分片完成列表的拷贝: list2 = list1[:],那我们可不可以直接写成 list2 = list1 更加简洁呢??
我们通过一段简单代码来看一下,到底结果如何:
list1 = [1, 3, 2, 9, 7, 8]
list2 = list1[:]
list3 = list1
print("list1: ", list1)
print("list2: ", list2)
print("list3: ", list3)
打印结果:
从上面的打印结果可以看到,list2和list3似乎都完成了对列表list1的复制,但真的是这样的吗?我们借助一个函数来看一下究竟是怎么回事!
list1 = [1, 3, 2, 9, 7, 8]
list2 = list1[:]
list3 = list1
print("list1: ", list1)
print("list2: ", list2)
print("list3: ", list3)
print("===== 对 list1 进行一下排序操作 ======")
list1.sort()
print("list1: ", list1)
print("list2: ", list2)
print("list3: ", list3)
打印结果:
从上面的打印结果可以看到,我们队list1进行了排序操作后,list2还是原来的顺序,而list3也一起跟着进行了排序操作。
这里作一下说明:
在python中,对象的赋值就是简单的对象引用,list3和list1是一样的,它们指向同一片内存,list3不过是list1的别名,是引用。我们可以使用list1与list3是否相同来判断,结果返回True,表明它们地址相同,内容相同。
赋值操作(包括对象作为参数、返回值)不会开辟新的内存空间,它只是复制了新对象的引用。 也就是说,除了list3这个名字以外,没有其它的内存开销。
修改了list1,就影响了list3;同理,修改了list3就影响了list1。
6. 列表排序问题
顺序排序: list.sort()
逆序排序:
list.sort()
list.reverse()
或者: list.sort(reverse = True)
list = [1, 3, 2, 9, 7, 8]
list.sort()
print("list顺序排序: ", list)
list.reverse()
print("list逆序排序: ", list)
list.sort(reverse=True)
print("list逆序排序: ", list)
打印结果:
7. 列表推导式
列表推导式是一种快速生成列表的方式。其形式是用方括号括起来的一段语句,如下例子所示:
list = [x * x for x in range(1, 10)]
print(list)
打印结果:
列表推导式这样理解:首先执行for循环,对于每一个x,代入x*x中进行运算,将运算结果逐一添加到一个新列表内,循环结束,得到最终列表。它相当于下面的代码:
list = []
for i in range(1, 10):
list.append(i*i)
print(list)
打印结果:
列表推导式为我们提供了一种在一行内实现较为复杂逻辑的生成列表的方法。其核心语法是用中括号[]将生成逻辑封装起来。
列表推导式的变式:
(1)增加条件语句
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
(2)多重循环
>>> [a + b for a in ‘123' for b in ‘abc']
['1a', '1b', '1c', '2a', '2b', '2c', '3a', '3b', '3c']