跳转至

2.6.List

Windows 10
Python 3.7.3 @ MSC v.1915 64 bit (AMD64)
Latest build date 2020.11.22
列表的方 法 描 述
aList.append(obj) 等同于aList[len(aList):len(aList)] = [obj]
aList.clear() 删除aList的所有元素
aList.count(obj) 返回aList中与obj相等的元素个数
aList.copy() 返回aList的副本。请注意,这是浅复制,即不会复制元素
aList.extend(sequence) 等同于aList[len(aList):len(aList)] = sequence
aList.index(obj) 返回aList中第一个与obj相等的元素的索引;如果没有这样的元素,就引发 ValueError异常
aList.insert(index, obj) 如果index >= 0,就等同于aList[index:index] = [obj];如果index < 0,就 将指定的对象加入到列表开头
aList.pop([index]) 删除并返回指定索引(默认为-1 )处的元素
aList.remove(obj) 等同于del aList[aList.index(obj)]
aList.reverse 就地按相反的顺序排列列表的元素
aList.sort([cmp][,key][,reverse]) 就地对aList的元素进行排序(稳定排序)。可通过提供比较函数cmp、键函数 key (创建用户排序的键)和降序标志reverse (—个布尔值)进行定制

list的方法

创建一个list

# 查看list的方法、属性
[method for method in dir(list()) if not method.startswith("_")]
['append',
 'clear',
 'copy',
 'count',
 'extend',
 'index',
 'insert',
 'pop',
 'remove',
 'reverse',
 'sort']

修改元素的值

修改现有list的值,通过索引、切片来完成。

list_1 = [0, 1, 2, 3]
# 修改某个索引对应元素的值
list_1[0] = "item"
print(list_1)
['item', 1, 2, 3]

通过切片修改某个连续区域的值,切片的长度和用于赋值的序列长度可以不同。

list_1 = [0, 1, 2, 3]
list_1[0:2] = ["item_1", "item_2", "item_3"]
print(list_1)
['item_1', 'item_2', 'item_3', 2, 3]

添加一个新元素到末尾

append方法每次只能添加一个新元素

list_1 = [0, 1, 2, 3]
list_1.append("item")
print(list_1)
[0, 1, 2, 3, 'item']

添加任意个新元素到末尾

extend方法允许我们通过另一个list来扩充当前的list。实际上,这看起来像是用+拼接list,但extend方法会直接修改原列表,不返回副本。

list_1 = [0, 1, 2, 3]
list_2 = ["item_1", "item_2", "item_3"]
list_1 + list_2
# 此时 list_1 没有被修改
print(f"Use + operator: {list_1}")

list_1.extend(list_2)
# 此时list_1被修改
print(f"Use extend method: {list_1}")
Use + operator: [0, 1, 2, 3]
Use extend method: [0, 1, 2, 3, 'item_1', 'item_2', 'item_3']

可以看出,使用+拼接list会创建一个新对象,显然拼接的效率回比extend方法的效率低。

还可以借助切片来扩充list,像这样:

list_1 = list(range(4))
list_2 = ["item_1", "item_2", "item_3"]
# 这样做可读性不高
list_1[len(list_1):] = list_2
print(list_1)
[0, 1, 2, 3, 'item_1', 'item_2', 'item_3']

在任意位置插入新元素

insert方法将一个对象插入指定位置

list_1 = list(range(4))
print(f"Original list: {list_1}")
list_1.insert(0, "item")
print(f"New list: {list_1}")
Original list: [0, 1, 2, 3]
New list: ['item', 0, 1, 2, 3]

当然,也可以借助切片在任意位置插入元素。注意的是,对一个list使用切片,必定会得到一个list,这就需要用一个list对切片赋值。

# 这样虽然巧妙,但是可读性比不上insert。
list_1 = list(range(4))
print(f"Original list: {list_1}")
list_1[0:0] = ["item"]
print(f"New list: {list_1}")
Original list: [0, 1, 2, 3]
New list: ['item', 0, 1, 2, 3]

删除\取出最后一个(任意位置的)元素

注意,pop是list中唯一一个修改原列表,并且有返回值的方法

list_2 = ['0', '00', '000']
list_2.pop()
'000'

pop默认删除最后一个元素,但是也可以输入索引值,指定删除元素的位置

list_2 = ['0', '00', '000']
list_2.pop(0)
list_2
['00', '000']

删除第一次出现的元素

list_1 = [1, 2, 3, 1]
list_1.remove(1)
list_1
[2, 3, 1]

反序排序

list_1 = [0, 1, 2, 3]
list_1.reverse()
list_1
[3, 2, 1, 0]

排序

方法sort接受两个可选参数:keyreverse。将key设置为一个用于排序的**函数。然而,不会直接使用这个函数来判断一个元素是否比另一个元素小,而是使用它来为每个元素创建一个键,再根据这些键对元素进行排序。对于另一个关键字参数reverse,只需将其指定为TrueFalse,以指出是否要按相反的顺序对列表进行排序。

list_3 = ['aardvark', 'abalone', 'acme', 'add', 'aerate']
list_3.sort(key=len)
list_3
['add', 'acme', 'aerate', 'abalone', 'aardvark']
# 按照长度降序排序
list_3.sort(key=len, reverse=True)
list_3
['aardvark', 'abalone', 'aerate', 'acme', 'add']

统计元素出现的次数

list_1 = [1, 2, 3, 1]
list_1.count(1)
2

得到某个值第一次出现时对应的索引值

list_1 = [1, 2, 3, 1]
list_1.index(1)
0

浅拷贝列表

list_1 = [1, 2, 3]
list_4 = list_1
list_1[0] = "modified"
print("list_1:", list_1)
print("list_4:", list_4)
list_1: ['modified', 2, 3]
list_4: ['modified', 2, 3]
# 浅拷贝
list_1 = [1, 2, [3, 4]]
list_5 = list_1.copy()
list_1[0] = "modified"
list_1[2][0] = "modified"
print("list_1:", list_1)
print("list_5:", list_5)
list_1: ['modified', 2, ['modified', 4]]
list_5: [1, 2, ['modified', 4]]

清空列表

list_1.clear()
list_1
[]

逻辑运算

print([1, 2, 3] > [0, 2, 3])
print([1, 2, 3] >= [1, 2, 3])
print([1, 2, 3] == [1, 2, 3])
print(any([0, 2, 3]))
print(all([0, 2, 3]))
True
True
True
True
False