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