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 的作用是:

  1. 如果 key 存在于字典中,那么直接返回对应的值,等效于 get 方法
  2. 如果 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)

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}

 

 

后续有好的方法继续添加

 

posted @ 2018-01-02 21:49  Nice_keep-going  阅读(380)  评论(0编辑  收藏  举报