python str,list,dict 等的一些高效实用方法
了解一些特定的方法和一些高效使用方法是代码简洁明了,易于阅读的关键。
下面有些转自(python之禅)
一、字符串和列表
1.1、迭代列表时如何访问列表下标索引
enumerate 可以指定元素的第一个元素从多少开始,默认是0,也可以指定从1 开始。
>>> items = [3,7,4] >>> for key,val in enumerate(items,start=1): ... print(key,'---->',val) ... 1 ----> 3 2 ----> 7 3 ----> 4
1.2、append 与extend方法有什么区别
append 表示把某个数据当做新元素追加到列表的最后面,它的参数可以是任意对象。
>>> x = [1,2,3] >>> y = [5,6] >>> x.append(y) >>> x [1, 2, 3, [5, 6]] >>> z = {'k1':'v1','k2':'v2'} >>> x.append(z) >>> x [1, 2, 3, [5, 6], {'k1': 'v1', 'k2': 'v2'}]
extend 的参数必须是一个可迭代对象,表示把该对象里面的所有元素逐个追加到列表的后面。
>>> x = [1,2,3] >>> y = [5,6] >>> z = {'k1':'v1','k2':'v2'} >>> x.extend(y) >>> x [1, 2, 3, 5, 6] >>> x.extend(z) >>> x [1, 2, 3, 5, 6, 'k1', 'k2'] -----------添加字典values >>> x = [1, 2, 3, 5, 6] >>> x.extend(z.values()) >>> x [1, 2, 3, 5, 6, 'v1', 'v2']
1.3、检查列表是否为空
普通版: >>> items = [] >>> if len(items) == 0: ... print("空列表") ... 空列表 或者: >>> if items == []: ... print("空列表") ... 空列表 优雅版: >>> if not items: ... print("空列表") ... 空列表
1.4、如何对列表里面嵌套的字典排序
列表排序有两种方式,一种是列表自带的方式 sort
,一种是内建函数 sorted
。复杂的数据类型可通过指定 key
参数进行排序。由字典构成的列表,根据字典元素中的age字段进行排序:
items = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}, {"name": 'cater', 'age': 20}]
使用 列表自带的sort,对age进行排序。
>>> items.sort(key=lambda item: item.get("age")) >>> items [{'name': 'Bart', 'age': 10}, {'name': 'cater', 'age': 20}, {'name': 'Homer', 'age': 39}]
如果不希望改变原列表,而是生成一个新的有序列表对象,那么可以内置函数 sorted ,该函数返回新列表
sorted 升序排列: >>> new_items = sorted(items,key=lambda item: item.get("age")) >>> new_items [{'name': 'Bart', 'age': 10}, {'name': 'cater', 'age': 20}, {'name': 'Homer', 'age': 39}] sorted 降序排列: >>> new_items = sorted(items,key=lambda item: item.get("age"),reverse=True) >>> new_items [{'name': 'Homer', 'age': 39}, {'name': 'cater', 'age': 20}, {'name': 'Bart', 'age': 10}] 当然,上面的列表的sort 也可以进行降序排列,用法一样。
二、字典
2.1、用 in 关键字检查key 是否存在
Python之禅中有一条开发哲学是:
There should be one-- and preferably only one --obvious way to do it.
尽量找一种,最好是唯一种显而易见的解决方案。Python2 中判断某个 key 是否存在字典中可使用 has_key
方法,另外一种方式是使用 in
关键字。但是强烈推荐使用后者,因为 in 的处理速度更快,另外一个原因是 has_key 这个方法在 Python3 被移除了,要想同时兼容py2和py3两个版本的代码,用 in 是最好的选择。
>>> z = {'k1':'v1','k2':'v2'} >>> if 'k1' in z: ... print('exist') ... exist
2.2、用 get 获取字典中的值
关于获取字典中的值,一种简单的方式就是用d[x]
访问该元素,但是这种情况在 key 不存在的情况下会报 KeyError 错误,当然你可以先用 in 操作检查 key 是否在字典中再获取,但是python 之禅说过:
Simple is better than complex. Flat is better than nested.
好的代码应该是简单易懂的,扁平的代码结构更加可读。
>>> dic = {'k1':'v1','k2':'v2'} >>> print(dic.get('k3',"default")) default >>> print(dic.get('k1',"default")) v1
如果存在则打印出字典里面对应的value,不存在打印默认的值。
2.3、用setdefault 为字典中不存在的key设置缺省值 (非常有意思)
data = [ ("animal", "bear"), ("animal", "duck"), ("plant", "cactus"), ("vehicle", "speed boat"), ("vehicle", "school bus") ]
在做分类统计时,希望把同一类型的数据归到字典中的某种类型中,比如上面代码,把相同类型的事物用列表的形式重新组装,得到新的字典
>>> groups = {} >>> for (key,value) in data: ... groups.setdefault(key,[]).append(value) ... >>> groups {'animal': ['bear', 'duck'], 'plant': ['cactus'], 'vehicle': ['speed boat', 'school bus']}
setdefault
的作用是:
- 如果 key 存在于字典中,那么直接返回对应的值,等效于 get 方法
- 如果 key 不存在字典中,则会用 setdefault 中的第二个参数作为该 key 的值,再返回该值。
2.4、用defaultdict 初始化字典对象
如果不希望 d[x] 在 x 不存在时报错,除了在获取元素时使用 get 方法之外,另外一种方式是用 collections 模块中的 defaultdict,在初始化字典的时候指定一个函数,其实 defaultdict 是 dict 的子类。
data = [ ("animal", "bear"), ("animal", "duck"), ("plant", "cactus"), ("vehicle", "speed boat"), ("vehicle", "school bus") ]
>>> from collections import defaultdict >>> groups02 = defaultdict(list) >>> for (key,value) in data: ... groups02[key].append(value) ... >>> groups02 defaultdict(<class 'list'>, {'animal': ['bear', 'duck'], 'plant': ['cactus'], 'vehicle': ['speed boat', 'school bus']})
当 key 不存在于字典中时,list 函数将被调用并返回一个空列表赋值给 d[key],这样一来,你就不用担心调用 d[k] 会报错了。
>>> groups.get('animal','not exist') ['bear', 'duck'] >>> groups.get('animal1','not exist') 'not exist' >>> len(groups02) 3
2.5、使用字典推导式
推导式是个绝妙的东西,列表推导式一出,map、filter等函数黯然失色,自 Python2.7以后的版本,此特性扩展到了字典和集合身上,构建字典对象无需调用 dict 方法。
bad method:
>>> numbers = [1,2,3] >>> d = dict([(number,number*2) for number in numbers]) >>> d {1: 2, 2: 4, 3: 6}
相当于是,先得到元组对象,然后添加到列表里面,然后再把列表转成字典。
good method:
>>> numbers = [1,2,3] >>> d = {number:number*2 for number in numbers} >>> d {1: 2, 2: 4, 3: 6}
后续有好的方法继续添加