列表元素修改

一个列表在使用的过程中,是由一个list后面加一个索引号

  • 索引访问修改

    • list[index] = value

    • 索引不要超界

python 中不支持稀疏数组,因为索引不要超界

列表元素修改范例:

# 先给 l 定义为列表元素值为 [[1,2],3,['a'],2,0,2]
l = [[1,2],3,['a'],2,0,2]

# 通过查看 l 列表中 index 为 3 的值是 2
l [3]
2

# 这里我将 l 列表中的 index 3 索引修改为为 500
l [3] = 500

# 再次查看 l 列表中 index 3 的值已经修改为了 500
l [3]
500

l # l 在 ipython 中可以简写,也就是等于 print(l),我们可以发现 l 中第三个索引值已经修改为了 500
[[1, 2], 3, ['a'], 500, 0, 2]

在 list 中修改元素,就得通过索引的方式并且这个索引必须合法。用索引的方式来给它把这个索引所对应的位置的元素进行修改替换。

3.3.1 列表增加、插入元素使用 -1

在列表中常用的方法是 append

增加:

增加的动作就应该在尾部。

  • append(object) -> None(增加),也就是说 append 的返回值是 none

    • 列表尾部追加元素,返回None

    • 返回 None 就意味着没有新的列表产生,就地修改

    • 时间复杂度是 O(1)

插入:

只要用户要插入一个元素,对我们这个队伍来讲都要挪动,实际上带来非常大的效率问题,插入这个操作少做。

对一个列表来讲位置是通过索引 index 来表示。

  • insert(index, object) -> None(插入),只要插入的不是在列表的尾巴,就会产生列表的挪动。

    • 在指定的索引index处插入元素object

    • 返回None就意味着没有新的列表产生,就地修改

    • 时间复杂度是O(n),列表数据规模越大时间复杂度也大,因为在列表中是一个顺序结构所以一定要少做

    • 索引能超上下界吗?

      • 超越上界,尾部追加

      • 超越下界,头部追加

append 增加使用范例:

列表是可变类型,并且我们知道了 append 这个参数确实能够将元素追加到列表中去,但是不返回任何东西。

# 输入 l 查看当前列表的值
l
[[1, 2], 3, 1000, 500, 0, 2]

# 使用 append 在列表尾部增加一个 a 的值
l.append('a')  # 没有返回值,相当于返回了 none 这个值

# 再次查看 l 这个列表就会发现在尾部多了一个 a
l
[[1, 2], 3, 1000, 500, 0, 2, 'a']

# 这次使用 print 将 append 的返回值输出显示,也就是 none
print(l.append('b'))
None

# 再次查看 l 列表尾部中已经多了 b
l
[[1, 2], 3, 1000, 500, 0, 2, 'a', 'b']

insert 插入使用范例:

insert 动作在工作中少做

l.insert(0,'c') # 没有返回值,其实真实的返回值是 none

l # 会发现 c 已经跑到该列表最前面了,但是 c 往开头已插入其他元素就得挨个往后移动,所以这是一个非常耗时的动作因为它是一个 O(n) 的动作
['c', [1, 2], 3, 1000, 500, 0, 2, 'a', 'b']

insert 超界尾部追加使用范例:(但是推荐使用 append 追加)

# 在 l 列表中添加一个 100 元素位置得值 d
l.insert(100,'d') # 因为在当前 l 这个列表中没有 100 的元素,所以就会将 d 默认放到最后面

# 再次查看 l 列表就会发现 d 默认在最后面
l
['c', [1, 2], 3, 1000, 500, 0, 2, 'a', 'b', 'd']

insert 头部追加使用范例:

# 通过查看 l 列表得值
l
['c', [1, 2], 3, 1000, 500, 0, 2, 'a', 'b', 'd']

# 通过 insert 选的索引位置为 0 也就是该列表的头部,插入一个 e 的值
l.insert(0,'e')

# 再次查看 l 列表就会发现 e 值已经追加到头部
l
['e', 'c', [1, 2], 3, 1000, 500, 0, 2, 'a', 'b', 'd']

所以能用 append 尽量用 append ,并且在列表中能够从尾部移除就在尾部移除,因为中间移除它的时间复杂度都是大 O(n) 的动作,而且我们要在列表的尾部追加使用 append 即可、假如要在该列表中的头部追加使用 insert 0 即可

3.3.2 列表增加、插入元素使用 -2

扩展(可以将其他的东西扩展起来):

  • extend(iteratable)->None

    • 将可迭代对象的元素追加进来,返回None,当看见返回是 none 就可以认为是就地修改就是把自己当前的列表给改变了,就地修改之后把其他可迭代元素里面的元素给他一个一个拿进来以后变成自己的。

    • 就地修改

  • + -> list

    • 连接操作,将两个列表连接起来

    • 产生新的列表,原列表不变

    • 本质上调用的是_add)方法

  • * -> list

    • 重复操作,将本列表元素重复n次,返回新的列表

extend 使用范例:

通过调用 range 函数来实现迭代

# 通过 extend 参数中迭代追加,然后再使用 range 函数从 100 到 106 进行追加,返回 none
l.extend(range(100,106)) 

# 就地修改,就是把自己改变了
l
['e',
 'c',
 [1, 2],
 3,
 1000,
 500,
 0,
 2,
 'a',
 'b',
 'd',
 100,
 101,
 102,
 103,
 104,
 105]

创建一个新的对象,并且这个新的对象没有人在使用就会被自动的内存垃圾回收,这只是临时用了一下

# 造一个新的列表,并且有返回值,下面这些就是它的返回值
l + list(range(5)) 
['e',
 'c',
 [1, 2],
 3,
 1000,
 500,
 0,
 2,
 'a',
 'b',
 'd',
 100,
 101,
 102,
 103,
 104,
 105,
 0,
 1,
 2,
 3,
 4]


# 但是 l 这个裂变并没有变化
l 
['e',
 'c',
 [1, 2],
 3,
 1000,
 500,
 0,
 2,
 'a',
 'b',
 'd',
 100,
 101,
 102,
 103,
 104,
 105]

# 给 l1 列表赋值
l1 = [1,2]  # l1 和 [1,2] 这个对象关联起来

# 查看 l1 为 [1,2]
l1
[1, 2]

# 临时创建了一个列表,相当于将 l1 这个列表中的元素重复了三遍返回一个列表对象,生产了一个新的列表
l1 * 3 
[1, 2, 1, 2, 1, 2]

# 通过观察 l1 列表并没有变化
l1 
[1, 2]

+ -> list两个列表相加使用范例:

两个列表相加的这种操作尽量少做,因为每个列表在内存中都有连续空间,而且在创建第三个列表之后也需要一个连续空间,所以就会比较消耗内存。

# 将两个列表的内容相加
list(range(5)) + [100]
[0, 1, 2, 3, 4, 100]

* -> list使用范例:

乘法在使用的时候需要小心是有坑的

点赞