Python 进阶——重访 list

  • (1)如果 list 的元素各不重复,如从 set 而来,

    可建立 value 与 index 的一一映射(list 中元素存在重复时,l.index[val] 返回的是第一个符合的索引):

    l[i]    ⇒ index => value
    l.index(val) ⇒ val => index
  • (2)注意区别 len() 和 list 的 count 函数(返回的不是 list 的长度,而是某元素出现的次数),

    >> len([0, 1, 1, 2])
    4 
    >> [0, 1, 1, 2].count(1)
    2

1. list 的底层实现

Python 中的 list,不是由若干个独立节点相互引用而成的,而是一整块单一连续的内存区块——称之为(array),这必然导致了如下后果。

  • (1)尾部进(append(x)),尾部出(pop()),左端受限,风格上,接近 stack;
  • (2)前端的pop(0)(或insert(0, ))的操作时间都是线性级别的;

2. 成员函数的返回值

list 的大部分的成员函数返回值(更易型操作)都是为 NoneType 的:

  • (1).extend()
  • (2).append()
  • (3).remove()
  • (4).reverse()

所以,return l.extend(l2)这样的操作是无意义的,而应该转换为:

l.extend(l2)
return l

.pop() 无论含不含参数(含参:弹出指定位置的元素,不含参:弹出尾端的元素)是 list 的更易型操作,存在返回值;

3. pop() vs remove()

  • (0)两者都是对 list 的更易型操作

  • (1)pop() 接受的参数是下标,remove() 接收元素值;

    • 也即 pop() 根据下标删除元素,remove() 根据具体的元素值删除元素;

    • 也即如果我们能够比较容易拿到元素的下标,我们使用 pop,如果我们想要删除某一给定的值,则使用 remove()

    • index()成员函数架起了pop()和remove()之间的桥梁
      l.pop(l.index(v)) = l.remove(v)
      l.pop(idx) = l.remove(l[idx])

  • (2)pop() 返回下标对应的元素值,remove() 返回值为空,符合逻辑

  • (3)pop()接受参数为空,从尾部开始弹出

4. 二维列表(lists of lists)

二维列表用于刻画树结构



我们可将该树表示为一个二维列表(lists of lists):

>>> T = [['a, b'], ['c'], ['d', ['e', 'f']]]

5. extend vs append

>>> l1 = [1, 2]
>>> l1+1
TypeError: can only concatenate(连接) list (not "int") to list

>>> l1 + [1]
[1, 2, 1]
                # list之间不适用数学运算
                # `+`表示的是之间的拼接

对比extend与append:

>>> l1.extend(l2)
>>> l1
[1, 2, 3, 4]

# 等价于
>>> [l1.append(i) for i in l2]
[None, None]
>>> l1
[1, 2, 3, 4]
>>> l1.append(l2)
>>> l1
[1, 2, [1, 2]]
                # list是异质性(heterogeneous)容器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值