目录
列表
特点
- 任意对象的有序集合
- 通过偏移读取
- 可变长度、异构以及任意嵌套
- 属于可变序列的分类
- 对象引用数组
Python中包含了零个或多个其他对象的引用。
常用列表常量和操作
操作 | 解释 |
---|---|
L = [] | 一个空的列表 |
L = [0,1,2,3] | 四项:索引为0到3 |
L = [‘abc’,[‘def’,’ghi’]] | 嵌套的子列表 |
L = list(‘spam’) L = list(range(-4,4)) | 可迭代项目的列表,连续整数的列表 |
L[i] L[i][j] L[i:j] len(L) | 索引,索引的索引,分片,求长度 |
L1 + L2 | 合并 |
L * 3 | 重复 |
for i in L:print(i) 3 in L | 迭代,成员关系 |
L.append(4) L.extend([2,3,4]) L.insert(i,x) L.index(1) L.count(1) L.sort() L.reverse() | 方法:增长,排序,搜索,插入,反转等 |
del L[k] del L[i:j] L[i:j] = [] | 删除,缩短 |
L.pop() L.remove() | 移除元素 |
L[i] = 1 L[i:j] = [1,2,3] | 索引赋值;分片赋值 |
L = [i for i in range(1,5)] list(map(ord,’spam’)) | 列表解析 |
原处修改列表
对列表中的元素进行原地修改主要有两种方式。
索引分片赋值
L = ['Tom','Steve','Mara']
L[1] = 'Ciaran'
print(L)
L2 = ['Tom','Steve','Mara']
L2[1:] = ['Bobbie','Earl']
print(L2)
['Tom', 'Ciaran', 'Mara']
['Tom', 'Bobbie', 'Earl']
分片赋值是一次性替换整个片段或“栏”。因为被赋值的序列长度不一定要与被赋值的分片的长度相匹配,所以分片赋值能够用来替换(覆盖)、增长(插入)、缩短(删除)主列表。
在实际的操作中不推荐这么做,更直接的方法是直接使用方法来增加、删除元素。
列表方法赋值
字典
特点
- 通过键而不是偏移量来读取
- 任意对象的无序集合
- 可变长、异构、任意嵌套
- 属于可变映射类型
- 对象引用表(散列表)
常见字典常量和操作
操作 | 解释 |
---|---|
D = {} | 空字典 |
D = {‘spam’:2,’eggs’:3} | 两项目字典 |
D = {‘food’:{‘ham’:1,’eggs’:2}} | 嵌套 |
D = dict.fromkeys([‘a’,’b’]) | 其它构造技术 |
D = dict(zip(keyslist,valslist)) D = dict(name = ‘Bob’,age = 10) | 关键字、对应的对、键列表 |
D[‘eggs’] D[‘food’][‘ham’] | 以键进行索引运算 |
‘eggs’ in D | 成员关系:键存在测试 |
D.keys() | 获得键值 |
D.values() | 值 |
D.items() | 键+值 |
D.copy() | 副本 |
D.get(key,default) | 默认 |
D.update(D2) | 合并 |
D.pop(key) | 删除等 |
len(D) | 长度 |
D[key] = 10 | 新增/修改键,删除键 |
del D[key] | 根据键删除条目 |
list(D.keys()) D1.keys() & D2.keys() | 字典视图 |
D = {x:x*2 for x in range(10)} | 字典解析 |
字典视图
在Python3中,字典的keys,values,items都返回视图对象,而在Python2.6中,它返回的实际结果是列表。
d = {'name':'Tom','age':10}
key = d.keys()
print(type(key))
print(key)
d['class'] = 1
print(key)
<class 'dict_keys'>
dict_keys(['name', 'age'])
dict_keys(['name', 'age', 'class'])
字典视图保持了字典成分的最初的顺序,反映字典未来的修改,并且能够支持集合操作。字典视图动态地反映在视图对象创建之后对字典做出的修改。
Python3的字典自己拥有迭代器,它返回连续键。
d = {'name':'Tom','age':10}
for i in d:
print(i)
name
age
排序字典键
现想要将字典根据键值排序输出。
将字典的键取出后进行排序,进行遍历输出。
d = {'name':'Tom','age':10,'class':1}
k = d.keys()
k = sorted(k)
for i in k:
print(i,d[i])
注意事项
- 序列运算无效
- 对新索引赋值会添加项
- 键不一定总是字符串
避免missing-key错误
[su_accordion class=””][su_spoiler title=in open=”no” style=”default” icon=”plus” anchor=”” class=””]使用关键字in进行检测
d = {'Tom':'10','Mara':'18'}
if 'Tom' in d :
print(d['Tom'])
else:
print(0)
[/su_spoiler][su_spoiler title=try异常 open=”no” style=”default” icon=”plus” anchor=”” class=””]使用异常来处理。
d = {'Tom':'10','Mara':'18'}
try:
print(d['hello'])
except KeyError:
print(0)
[/su_spoiler][su_spoiler title=get()方法 open=”no” style=”default” icon=”plus” anchor=”” class=””]使用get()方法来处理。
d = {'Tom':'10','Mara':'18'}
print(d.get('Tom',0))
print(d.get('hello',0))
10
0
[/su_spoiler][/su_accordion]
列表方法
append() | insert() | sort() | |
extend() | remove() | ||
pop() |
pop()
语法
s.pop([i])
作用
提取在 i 位置上的项,并将其从 s 中移除。
append()
语法
list.append(obj)
作用
用于在列表末尾添加新的对象。
sort()
语法
sort(*, key=None, reverse=False)
作用
此方法会对列表进行原地排序,只使用 < 来进行各项间比较。异常不会被屏蔽——如果有任何比较操作失败,整个排序操作将失败(而列表可能会处于被部分修改的状态)。
sort() 接受两个仅限以关键字形式传入的参数 (仅限关键字参数):
key 指定带有一个参数的函数,用于从每个列表元素中提取比较键 (例如 key=str.lower)。对应于列表中每一项的键会被计算一次,然后在整个排序过程中使用。默认值 None 表示直接对列表项排序而不计算一个单独的键值。
可以使用functools.cmp_to_key() 将 2.x 风格的 cmp 函数转换为 key 函数。
reverse 为一个布尔值。如果设为 True,则每个列表元素将按反向顺序比较进行排序。
当顺序大尺寸序列时此方法会原地修改该序列以保证空间经济性。为提醒用户此操作是通过间接影响进行的,它并不会返回排序后的序列(请使用sorted() 显示地请求一个新的已排序列表实例)。
sort() 方法确保是稳定的。如果一个排序确保不会改变比较结果相等的元素的相对顺序就称其为稳定的 — 这有利于进行多重排序(例如先按部门、再接薪级排序)。
CPython implementation detail: 在一个列表被排序期间,尝试改变甚至进行检测也会造成未定义的影响。Python 的 C 实现会在排序期间将列表显示为空,如果发现列表在排序期间被改变将会引 发ValueError。
场景
[su_accordion class=””][su_spoiler title=基本用法 open=”no” style=”default” icon=”plus” anchor=”” class=””]对列表进行排序,使用key键值。
L = ['ABC','abc','cDE','BCD']
L.sort()
print(L)
L.sort(key=str.lower)
print(L)
L.sort(key=str.lower,reverse = True)
print(L)
['ABC', 'BCD', 'abc', 'cDE']
['ABC', 'abc', 'BCD', 'cDE']
['cDE', 'BCD', 'ABC', 'abc']
[/su_spoiler][/su_accordion]
注意
在Python2中,不同类型的元素是可以进行排序的,因为在内部定义了一个固定的顺序。
而在Python3中,对于不同的类型进制排序,会引发一个异常。
extend()
语法
extend(seq)
作用
用于在列表末尾一次性追加另一个序列中的多个值。注意这里说的是序列,而不仅仅只是列表,可迭代对象即可。
场景
[su_accordion class=””][su_spoiler title=基本用法 open=”no” style=”default” icon=”plus” anchor=”” class=””]对列表末尾追加多种元素。
L = ['Tom','Steve','Mara']
L.extend({i for i in range(1,5)})
L.extend((i for i in ['a','b','c']))
L.extend([i for i in range(10,15)])
print(L)
[/su_spoiler][/su_accordion]
字典方法
update() | get() | setdefault() | |
pop() |