python 三大推导式

推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导,在Python2和3中都有支持:

  • 列表(list)推导式
  • 字典(dict)推导式
  • 集合(set)推导式

一、列表推导式

1、使用[]生成list

基本格式

var = [out_exp_res for out_exp in input_list if out_exp == 2]
  out_exp_res:  列表生成元素表达式,可以是有返回值的函数。
  for out_exp in input_list:  迭代input_list将out_exp传入out_exp_res表达式中。
  if out_exp == 2:  根据条件过滤哪些值可以。

(1)最简单的列表推导式

>>> [i for i in '123']
['1', '2', '3']

(2)带条件的列表推导式

单条件

>>> [i for i in '123' if i!='2']
['1', '3']

多条件

>>> [i for i in '123' if i!='2' if i!='3']
['1']

if-else:

>>> [x+1 if x>=5 else x+5 for x in range(10)]
[5, 6, 7, 8, 9, 6, 7, 8, 9, 10]

(3)两个来源的列表推导式

   1.笛卡尔积列表推导式

>>> [(i,j) for i in '123' if i!='2' for j in '456']
[('1', '4'), ('1', '5'), ('1', '6'), ('3', '4'), ('3', '5'), ('3', '6')]

   2.非笛卡尔积列表推导式

>>> [(i,j) for i in range(3) for j in range(6) if (i+j)%3==0]
[(0, 0), (0, 3), (1, 2), (1, 5), (2, 1), (2, 4)]

(4)列表推导式生成匿名函数列表

>>> func=[lambda x: x*i for i in range(3)]
>>> func
[<function <listcomp>.<lambda> at 0x0000028F1A3D6AF8>, <function <listcomp>.<lambda> at 0x0000028F19D50AF8>, <function <listcomp>.<lambda> at 0x0000028F1A409048>]
>>> [f(2) for f in func]
[4, 4, 4]
>>> func=[lambda x,i=i: x*i for i in range(3)]
>>> [f(2) for f in func]
[0, 2, 4]

(5)嵌套推导式

>>> list_of_list = [[1,2,3],[4,5,6],[7,8]]
>>>
>>> #flatten
... print([y for x in list_of_list for y in x])
[1, 2, 3, 4, 5, 6, 7, 8]

2、使用()生成generator

将俩表推导式的[]改成()即可得到生成器。

>>> gnrt = (i for i in range(30) if i % 3 is 0)
>>> print(type(gnrt))
<class 'generator'>

 

二、字典推导式

字典推导和列表推导的使用方法是类似的,只不中括号该改成大括号。直接举例说明:

大小写合并计算:

>>> mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
>>> mcase_frequency = {
... k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0)
... for k in mcase.keys()
... if k.lower() in ['a','b']
... }
>>> print(mcase_frequency)
{'a': 17, 'b': 34}

 

三、集合推导式

它们跟列表推导式也是类似的。 唯一的区别在于它使用大括号{}。

>>> {x**2 for x in [1, 1, 2]}
{1, 4}

完结!!

 

posted @ 2020-03-18 15:45  wqbin  阅读(470)  评论(0编辑  收藏  举报