列表生成式
格式
[ x for x in 可迭代对象]
[ x for x in 可迭代对象 if 条件]
1. 把要生成的元素 x 放到前面,执行的时候,先执行后面的for循环。
2. 后面跟上for循环,可以有多个for循环,也可以在for循环后面再加个if条件。
3. for循环后面可以是任何方式的迭代器(元组/列表/生成器..),只要可迭代对象的元素中至少有一个值。
例1:最简单的
In [1]: [x for x in 'abcd']
Out[1]: ['a', 'b', 'c', 'd']
例2:加if判断
In [1]: res = [10,11,12,13]
In [2]: [x for x in res if x > 10]
Out[2]: [11, 12, 13]
原生实现:
In [1]: arr = []
In [2]: for x in res:
....: if x > 10:
....: arr.append(x)
....:
In [3]: arr
Out[3]: [11, 12, 13]
例3:迭代字典生成列表
print [v for k,v in {'a':'one','b':'two'}.items()]
输出:['one', 'two']
print [(k,v) for k,v in {'a':'one','b':'two'}.items()]
输出:[('a', 'one'), ('b', 'two')]
print [k+'='+v for k,v in {'name':'lyz','age':'26','job':'IT'}.items()]
输出:['job=IT', 'age=26', 'name=lyz']
字典生成式
格式
1. 在Python2.6或更早的版本,字典生成器可以接受迭代的键/值对。
d = dict((key, value) for (key, value) in iterable)
说明:
第一个k,v的()必须写,第二个()可不写。
2.6版本就是利用dict()函数,函数的参数是一个嵌套的序列,序列的元素是元组。
2. 从Python2.7或者3以后,你可以直接用字典推导式语法。
d = {key: value for (key, value) in iterable} # k,v的()可以不写
3. python2.7以上兼容两种写法,python2.6只能用第一种。
4. 可以用任何方式的迭代器(元组,列表,生成器..),只要可迭代对象的元素中有两个值。
python2.7写法
dict1 = {'one':1,'two':2,'three':3}
dict2 = {v:k for k,v in dict1.items()}
print dict2
输出:
{1: 'one', 2: 'two', 3: 'three'}
python2.6写法
dict1 = {'one':1,'two':2,'three':3}
dict3 = dict((v,k) for k,v in dict1.items())
print dict3
输出:
{1: 'one', 2: 'two', 3: 'three'}
例1:两种生成式方式生成字典
In [1]: arr=['wd','18','nan']
In [2]: dict((k,v) for k,v in enumerate(arr))
Out[2]: {0: 'wd', 1: '18', 2: 'nan'}
In [3]: {k:v for k,v in enumerate(arr)}
Out[3]: {0: 'wd', 1: '18', 2: 'nan'}
例2:线上实例
arr = [{'id':1,'name':'lyz','age':26},{'id':2,'name':'pc','age':30}]
print {str(x['id']):x['name'] for x in arr}
执行结果:
{'1': 'lyz', '2': 'pc'}
其他生成字典的方法
1. dict()函数
嵌套元组和嵌套类别可以直接通过dict命令转为字典(嵌套内部的元素只能是2个)
>>> a = [(1, 'ab'), (2, 'bc')]
>>> dict(a)
{1: 'ab', 2: 'bc'}
>>> result = ((1, 'ab'), (2, 'bc'))
>>> dict(result)
{1: 'ab', 2: 'bc'}
2. zip()函数
将多个元组或列表合并,合并规则是每个元组元素个数一致
In [1]: zip(('name','age','sex'),('wd','18','nan'))
Out[1]: [('name', 'wd'), ('age', '18'), ('sex', 'nan')]
In [2]: zip(['name','age','sex'],['wd','18','nan'])
Out[2]: [('name', 'wd'), ('age', '18'), ('sex', 'nan')]
In [3]: dict(zip(('name','age','sex'),('wd','18','nan'))) # 生产环境最常用
Out[3]: {'age': '18', 'name': 'wd', 'sex': 'nan'}
In [4]: zip(['name','age','sex'],['wd','18','nan'],['11',22]) # 列表元素个数不一致,以最少对列表为准
Out[4]: [('name', 'wd', '11'), ('age', '18', 22)]