____tz_zs
一、列表(list)
列表(list)是有序的元素集合,列表中每个元素类型可以不同。
可通过索引访问单个元素,如 list[2], list[-1],也可通过区间索引访问子列表内容(左闭右开),如 list[2:5], list[-3:]。
(1)创建列表
- list() 函数生成列表
l = list()
print(l) # []
l = list((1, 2, 3, 4, 5))
print(l) # [1, 2, 3, 4, 5]
l = list(range(5))
print(l) # [0, 1, 2, 3, 4]
l1 = list("abcdefg")
print(l1) # ['a', 'b', 'c', 'd', 'e', 'f', 'g']
- 列表生成式,生成列表
l = [i * 10 for i in range(5)]
print(l) # [0, 10, 20, 30, 40]
l = [i.upper() for i in "abcdefg"]
print(l) # ['A', 'B', 'C', 'D', 'E', 'F', 'G']
l = ["%s_%s" % (k1, k2) for k1, k2 in zip(['a', 'b', 'c'], ['A', 'B', 'C'])]
print(l) # ['a_A', 'b_B', 'c_C']
# 多层循环嵌套
l = ["%s_%s" % (k1, k2) for k1 in ['a', 'b', 'c'] for k2 in ['A', 'B', 'C']]
print(l) # ['a_A', 'a_B', 'a_C', 'b_A', 'b_B', 'b_C', 'c_A', 'c_B', 'c_C']
# 字典生成列表
l = [k + " = " + v for k, v in {'a': 'A', 'c': 'C', 'b': 'B'}.iteritems()]
print(l) # ['a = A', 'c = C', 'b = B']
# 使用 if 语句对列表进行筛选
l = [i for i in range(10) if i % 2 == 0]
print(l) # [0, 2, 4, 6, 8]
# 参考 https://www.liaoxuefeng.com/wiki/1016959663602400/1017317609699776
l = [i if i % 2 == 0 else i + 10 for i in range(10)]
print(l) # [0, 11, 2, 13, 4, 15, 6, 17, 8, 19]
(2)添加元素、合并列表
- extend 合并(拼接)两个列表,相当于 a[len(a):] = [x] 。
- list1 + list2
- list.extend(list2)
- list[len(list):] = list2
l1 = [1, 2, 3, 4]
l2 = ['a', 'b', 'c']
l3 = l1 + l2
print(l1) # [1, 2, 3, 4]
print(l2) # ['a', 'b', 'c']
print(l3) # [1, 2, 3, 4, 'a', 'b', 'c']
l1 = [1, 2, 3, 4]
l2 = ['a', 'b', 'c']
l3 = l1.extend(l2)
print(l1) # [1, 2, 3, 4, 'a', 'b', 'c']
print(l2) # ['a', 'b', 'c']
print(l3) # None
l1 = [1, 2, 3, 4]
l2 = ['a', 'b', 'c']
l1[len(l1):] = l2
print(l1) # [1, 2, 3, 4, 'a', 'b', 'c']
print(l2) # ['a', 'b', 'c']
print(l3) # None
- 生成 n 个重复元素的列表
- list * n
l2 = ['a', 'b', 'c']
l3 = l2 * 3
print(l3) # ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
- append 将单个元素或list添加到列表末尾,相当于 a[len(a):] = [x] 。
- list.append(x)
- list.append(list2)
- list[len(list):] = [list2]
l1 = [1, 2, 3, 4]
l2 = ['a', 'b', 'c']
l3 = l1.append(5)
l4 = l2.append("d")
print(l1) # [1, 2, 3, 4, 5]
print(l2) # ['a', 'b', 'c', 'd']
print(l3) # None
print(l4) # None
l1 = [1, 2, 3, 4]
l2 = ['a', 'b', 'c']
l3 = l1.append(l2)
print(l1) # [1, 2, 3, 4, ['a', 'b', 'c']]
print(l2) # ['a', 'b', 'c']
print(l3) # None
- insert 在位置 i 处插入新元素 x。
- list.insert(i, x)
l1 = [0, 1, 2, 3, 4]
l2 = l1.insert(3, "aaa")
print(l1) # [0, 1, 2, 'aaa', 3, 4]
print(l2) # None
(3)删除 list 中的元素
- list.remove(x) 删除列表中第一次出现的元素 x 。如果没有这个元素,则抛出 ValueError 异常。
- list.pop(i) 返回列表中 i 位置上的元素,并将其删除(如果没有传入参数 i,则默认删除最后一个)。如果列表为空或索引超出范围,则引发 IndexError。
- del list[i] 删除列表中 i 位置上的元素。
- list.clear() 移除列表中的所有元素。作用等同于
del a[:]
。
(4)对 list 中元素进行排序/乱序
- list.sort() 对列表元素排序,直接修改原列表。
python2 中可以对不同类型的变量进行排序。
list1 = [2, 4, 3, 1, "6", "a", 5, 9, 7]
list1.sort(cmp=None, key=None, reverse=False)
print list1
"""
[1, 2, 3, 4, 5, 7, 9, '6', 'a']
"""
python3 无法对不同类型的变量进行排序,会报错:
TypeError: '<' not supported between instances of 'str' and 'int'
- sorted() 是 Python 标准库中的内置函数,对所有可迭代的对象进行排序操作,返回一个新列表。ps:无论输入的是元组、列表、集合,它将始终返回一个列表。
sorted(iterable, key=None, reverse=False)- iterable – 可迭代对象。
- key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
- reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
list1 = [2, None, 4, 3, 1, "6", "a", 5, 9, 7]
print(list1) # [2, None, 4, 3, 1, '6', 'a', 5, 9, 7]
list2 = sorted(list1, key=lambda x: str(x))
print(list2) # [1, 2, 3, 4, 5, '6', 7, 9, None, 'a']
list3 = sorted(list1, key=lambda x: x)
print(list3) # TypeError: '<' not supported between instances of 'NoneType' and 'int'
- list.reverse() 将列表元素逆序排序。
- random.shuffle(list) 将列表元素乱序。
(5)查询和统计 list 中的元素
- len(list) 返回列表长度(元素个数)。
- x in list 检查元素是否在列表中。
- list.count(x) 返回元素 x 在列表中的数量。
- list.index(x) 返回第一次出现元素 x 的索引值。如果没有这样的元素将会抛出 ValueError 异常。
(6)复制 list 的各种方式
- list.copy() 返回列表的一个浅拷贝,等价于 a[:]。
import copy
a = [[11], 2, 3]
print("a :", id(a), a) # a : 139793256279112 [[11], 2, 3]
a1 = a
a2 = a[:]
a3 = list(a)
a4 = a.copy()
a5 = copy.copy(a)
a6 = copy.deepcopy(a)
print("a1 :", id(a1), a1)
print("a2 :", id(a2), a2)
print("a3 :", id(a3), a3)
print("a4 :", id(a4), a4)
print("a5 :", id(a5), a5)
print("a6 :", id(a6), a6)
"""
a1 : 139793256279112 [[11], 2, 3]
a2 : 139793256278344 [[11], 2, 3]
a3 : 139793256317576 [[11], 2, 3]
a4 : 139793256278472 [[11], 2, 3]
a5 : 139793256318792 [[11], 2, 3]
a6 : 139793256278408 [[11], 2, 3]
"""
a.append(4)
a[0].append(22)
print("a1 :", id(a1), a1)
print("a2 :", id(a2), a2)
print("a3 :", id(a3), a3)
print("a4 :", id(a4), a4)
print("a5 :", id(a5), a5)
print("a6 :", id(a6), a6)
"""
a1 : 139793256279112 [[11, 22], 2, 3, 4]
a2 : 139793256278344 [[11, 22], 2, 3]
a3 : 139793256317576 [[11, 22], 2, 3]
a4 : 139793256278472 [[11, 22], 2, 3]
a5 : 139793256318792 [[11, 22], 2, 3]
a6 : 139793256278408 [[11], 2, 3]
"""
参考
https://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list
https://www.cnblogs.com/ifantastic/p/3811145.html
二、遍历list同时对list进行修改的问题
在遍历list的同时对list本身进行增删,将会发生越界和漏值的问题。这是因为当执行for语句的时候,迭代次数就已经被 in 后面的可迭代对象确定了。
(1)问题示例:
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
for d in list1:
print(d)
if d == 'c':
list1.remove(d)
print(list1)
"""
a
b
c
e
f
g
['a', 'b', 'd', 'e', 'f', 'g']
"""
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
for i in range(len(list1)):
print(list1[i])
if list1[i] == 'c':
list1.pop(i)
# list1.remove(list1[i])
"""
a
b
c
e
f
g
Traceback (most recent call last):
File "/home/zmate/tzzs/mytz/df_test.py", line 65, in <module>
print(list1[i])
IndexError: list index out of range
"""
(2)替代方法
如果确实需要在遍历的同时修改list,则可采用以下集中方法。
- 使用while,在面对这样情况的时候可以灵活应对。
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
i = 0
while i < len(list1):
print(list1[i])
if list1[i] == 'c':
del list1[i]
else:
i += 1
print(list1)
"""
a
b
c
d
e
f
g
['a', 'b', 'd', 'e', 'f', 'g']
"""
- 遍历拷贝的list、但修改原有的list
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
list1_copy = list1.copy()
for d in list1_copy:
print(d)
if d == 'c':
list1.remove(d)
print(list1)
"""
a
b
c
d
e
f
g
['a', 'b', 'd', 'e', 'f', 'g']
"""
(3)参考
https://www.zhihu.com/question/49098374
https://docs.python.org/3/tutorial/controlflow.html#for-statements