与元组不同,列表的长度是可变的,它包含的内容也是可以修改的。
定义列表
定义列表一般有两种方式:
使用中括号
a = [1, 2, 3]
print(a) # [1, 2, 3]
使用list类型函数
list函数可以将元组,字符串等类型转换为list。
a = (1, 2, 3)
b = "123"
print(list(a), list(b)) # [1, 2, 3] ['1', '2', '3']
list函数也常用于将迭代器和生成器转化为列表。
a = range(10)
print(list(a))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
.
列表操作
列表操作主要有增(append, insert)移(pop, remove)连(extend, +)排(sort, sorted)和切片,下面主要记录增移连排。
增
- 使用append方法可以将元素添加到列表的尾部
a = [1, 2, 3, 4]
a.append(5)
print(a) #[1, 2, 3, 4, 5]
.
- 使用insert方法可以将元素插入到指定的列表位置
其中,第一个参数为插入后元素在列表中的位置,第二个元素为要插入的元素
a = [1, 2, 3, 4]
a.insert(1, 5) # 将5插入位置1
print(a) # [1, 5, 2, 3, 4]
insert相比append计算代价更高,因为子序列元素要移动,从而为待插入元素提供空间。如果想要在序列的头部插入元素,可以考虑用队列。
移
这里的移是移除的意思。
- 使用pop方法,可以将特定位置的元素移除并返回
a = [1, 2, 3, 4]
print(a.pop(1)) # 2(位置1上的元素)
print(a) # [1, 3, 4]
- 使用remove方法,会定位第一个符合要求的值并移除它
a = [1, 2, 1, 3, 4]
a.remove(1)
print(a) # [2, 1, 3, 4]
但是,在我们想删除列表中重复的元素时,使用remove会有一点小坑。
举个栗子,在这里,我们想删去列表中所有的1:
a = [1, 1, 2, 1, 1, 4, 5]
for i in a:
if i == 1:
a.remove(i)
print(a) # [2, 1, 1, 4, 5]
结果十分疑惑,为什么还有两个1没有删去?
这是因为,列表是可变的,每一次进行remove,列表的长度都会变化,列表中1的索引也会变化,但for循环中的 i 却没有随之变化
不妨打印每次for循环中的i和a来看看:
a = [1, 1, 2, 1, 1, 4, 5]
for i in a:
print(i, a)
if i == 1:
a.remove(i)
print(a)
# 1 [1, 1, 2, 1, 1, 4, 5]
# 2 [1, 2, 1, 1, 4, 5]
# 1 [1, 2, 1, 1, 4, 5]
# 4 [2, 1, 1, 4, 5]
# 5 [2, 1, 1, 4, 5]
# [2, 1, 1, 4, 5]
第一次:观察位置0的元素1,符合条件,删去
第二次:观察位置1的元素2,不符合条件(此时原列表中位置1的元素1已经被调整到了位置0,故逃过了检查)
第三次:观察位置2的元素1,符合条件,删去(因为remove方法删去的是第一个符合要求的值,故现在处于位置0的元素1被删去)
第四次:观察位置3的元素4,不符合条件(第三次循环中处于位置3的元素1被调整到了位置2,因此也逃过了检查)
第五次:观察位置4的元素5,不符合条件
至此,遍历完成。有些原本符合条件的元素因为列表调整而逃过了检查。
那么,有什么办法可以解决这种问题呢?
- 深拷贝。用深拷贝来判断,在原对象上remove
- 用count来算出列表中有多少个1,然后再挨个删除
.
连
- 两个列表可以直接用+号来连接
a = [1]
b = [2]
print(a+b) # [1, 2]
- 如果已经定义了一个列表,可以用extend方法向该列表添加多个元素
a = [1, 2]
b = [3, 4]
c = (5, 6)
d = "78"
a.extend(b)
a.extend(c)
a.extend(d)
print(a) # [1, 2, 3, 4, 5, 6, '7', '8']
extend中的参数既可以是列表,也可以是元组,字符串等对象。
虽然效果相同,但+连接比extend代价要高一些。因为+过程中创建了新的列表,并且还要复制对象。而extend是在已经存在的列表对象上进行修改。
.
排
- 可以用sort方法来对列表进行内部排序(无需新建对象)
a = [1, 3, 2, 77, 4]
a.sort()
print(a) # [1, 2, 3, 4, 77]
- 可以用sorted方法对可迭代对象进行排序(新建对象)
a = [1, 3, 2, 77, 4]
b = sorted(a)
print(b) # [1, 2, 3, 4, 77]
关于sorted方法的参数请参阅参考资料2
参考资料
- 《利用python进行数据分析》
- https://www.runoob.com/python/python-func-sorted.html
- https://blog.csdn.net/wuli_dear_wang/article/details/88616163