python学习笔记:列表操作

与元组不同,列表的长度是可变的,它包含的内容也是可以修改的。

定义列表

定义列表一般有两种方式:

使用中括号
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)和切片,下面主要记录增移连排。

  1. 使用append方法可以将元素添加到列表的尾部
a = [1, 2, 3, 4]
a.append(5)
print(a)        #[1, 2, 3, 4, 5]

.

  1. 使用insert方法可以将元素插入到指定的列表位置
    其中,第一个参数为插入后元素在列表中的位置,第二个元素为要插入的元素
a = [1, 2, 3, 4]
a.insert(1, 5)  # 将5插入位置1
print(a)        # [1, 5, 2, 3, 4]

insert相比append计算代价更高,因为子序列元素要移动,从而为待插入元素提供空间。如果想要在序列的头部插入元素,可以考虑用队列。

这里的移是移除的意思。

  1. 使用pop方法,可以将特定位置的元素移除并返回
a = [1, 2, 3, 4]
print(a.pop(1)) # 2(位置1上的元素)
print(a)        # [1, 3, 4]
  1. 使用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,不符合条件

至此,遍历完成。有些原本符合条件的元素因为列表调整而逃过了检查。

那么,有什么办法可以解决这种问题呢?

  1. 深拷贝。用深拷贝来判断,在原对象上remove
  2. 用count来算出列表中有多少个1,然后再挨个删除

.

  1. 两个列表可以直接用+号来连接
a = [1]
b = [2]
print(a+b)    # [1, 2]
  1. 如果已经定义了一个列表,可以用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是在已经存在的列表对象上进行修改

.

  1. 可以用sort方法来对列表进行内部排序(无需新建对象)
a = [1, 3, 2, 77, 4]
a.sort()
print(a)    # [1, 2, 3, 4, 77]
  1. 可以用sorted方法对可迭代对象进行排序(新建对象)
a = [1, 3, 2, 77, 4]
b = sorted(a)
print(b)            # [1, 2, 3, 4, 77]

关于sorted方法的参数请参阅参考资料2

参考资料

  1. 《利用python进行数据分析》
  2. https://www.runoob.com/python/python-func-sorted.html
  3. https://blog.csdn.net/wuli_dear_wang/article/details/88616163
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值