(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)容器