推导式是Python中很强大的、很受欢迎的特性,具有语言简洁,简化代码,速度快等优点。推导式包括:
1.列表推导式
2.字典推导式
3.集合推导式
4.嵌套列表推导式
注意: 字典和集合推导是最近才加入到Python的(Python 2.7 和Python 3.1以上版). 下面简要介绍下:

第一:列表推导式

  列表推导式也叫列表解析式。
  功能:是提供一种方便的列表创建方法,只用一条简洁的表达式即可对得到的元素进行转换变形,所以,列表解析式返回的是一个列表
  格式:用中括号括起来,中间用for语句,后面跟if语句用作判读,满足条件的传到for语句前面用作构建先的列表

  其基本格式如下:

    [expr for value in collection ifcondition]

  过滤条件可有可无,取决于实际应用,只留下表达式;相当于下面这段for循环:   

  result = []
  for value in collection:
   if condition:
  result.append(expression)

  例1:  过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母   

  >>> names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
  >>> [name.upper() for name in names if len(name)>3]
  ['ALICE', 'JERRY', 'WENDY', 'SMITH']

  例2:  求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表

  >>> [(x,y) for x in range(5) if x%2==0 for y in range(5) if y %2==1]
  [(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]

  例3:  求M中3,6,9组成的列表

  >>> M = [[1,2,3],
  ... [4,5,6],
  ... [7,8,9]]
  >>> M
  [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  >>> [row[2] for row in M]
  [3, 6, 9]   #或者用下面的方式
  >>> [M[row][2] for row in (0,1,2)]
  [3, 6, 9]

  例4:  求M中斜线1,5,9组成的列表 

  >>> M
  [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  >>> [M[i][i] for i in range(len(M))]
  [1, 5, 9]

  例5:  求M,N中矩阵和元素的乘积

  >>> M = [[1,2,3],
  ... [4,5,6],
  ... [7,8,9]]
  >>> N = [[2,2,2],
  ... [3,3,3],
  ... [4,4,4]]
    >>> [M[row][col]*N[row][col] for row in range(3) for col in range(3)]
  [2, 4, 6, 12, 15, 18, 28, 32, 36]
  >>> [[M[row][col]*N[row][col] for col in range(3)] for row in range(3)]
  [[2, 4, 6], [12, 15, 18], [28, 32, 36]]
  >>> [[M[row][col]*N[row][col] for row in range(3)] for col in range(3)]
  [[2, 12, 28], [4, 15, 32], [6, 18, 36]]

  例5:  讲字典中age键,按照条件赋新值

  

  >>> bob
  {'pay': 3000, 'job': 'dev', 'age': 42, 'name': 'Bob Smith'}
  >>> sue
  {'pay': 4000, 'job': 'hdw', 'age': 45, 'name': 'Sue Jones'}
  >>> people = [bob, sue]
  >>> [rec['age']+100 if rec['age'] >= 45 else rec['age'] for rec in people] # 注意for位置
  [42, 145]

第二:字典推导式

  字典和集合推导式是该思想的延续,语法差不多,只不过产生的是集合和字典而已。其基本格式如下:

    { key_expr: value_expr for value in collection if condition }

  例1:  用字典推导式以字符串以及其长度建字典

  >>> strings = ['import','is','with','if','file','exception']
  >>> D = {key: val for val,key in enumerate(strings)}
  >>> D
  {'exception': 5, 'is': 1, 'file': 4, 'import': 0, 'with': 2, 'if': 3}

  例2:  大小写key合并

    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
# Output: {'a': 17, 'b': 34}

  例3.快速更换key和value

  mcase = {'a': 10, 'b': 34}
  mcase_frequency = {v: k for k, v in mcase.items()}
  print mcase_frequency
  # Output: {10: 'a', 34: 'b'}

第三:集合推导式

  集合推导式跟列表推导式非常相似,唯一区别在于用{}代替[]。其基本格式如下:

  { expr for value in collection if condition }

  例1:  用集合推导建字符串长度的集合

  >>> strings = ['a','is','with','if','file','exception']
  >>> {len(s) for s in strings} #有长度相同的会只留一个,这在实际上也非常有用
  set([1, 2, 4, 9])

第四:嵌套列表推导式

  嵌套列表是指列表中嵌套列表,比如说: 
  >>> L = [[1,2,3],
   [4,5,6],
   [7,8,9]]

   例1: 一个由男人列表和女人列表组成的嵌套列表,取出姓名中带有两个以上字母e的姓名,组成列表

      names = [['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe'],
  ['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']]

  用for循环实现:

  tmp = []
  for lst in names:
  for name in lst:
  if name.count('e') >= 2:
  tmp.append(name)   print tmp
  #输出结果
  >>>
  ['Jefferson', 'Wesley', 'Steven', 'Jennifer']

  用嵌套列表实现:

  >>> names = [['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe'],
  ['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']]
  >>> [name for lst in names for name in lst if name.count('e')>=2] #注意遍历顺序,这是实现的关键
  ['Jefferson', 'Wesley', 'Steven', 'Jennifer']

  

本文链接:http://www.cnblogs.com/xuchunlin/p/6059707.html

python列表推导式详解的更多相关文章

  1. python列表推导式详解 列表推导式详解 字典推导式 详解 集合推导式详解 嵌套列表推导式详解

    推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,简化代码,速度快等优点.推导式包括:1.列表推导式2.字典推导式3.集合推导式4.嵌套列表推导式注意: 字典和集合推导是最近才加入到Pyt ...

  2. day14 python各种推导式详解

    推导式的套路 之前我们已经学习了最简单的列表推导式和生成器表达式.但是除此之外,其实还有字典推导式.集合推导式等等. 下面是一个以列表推导式为例的推导式详细格式,同样适用于其他推导式. variabl ...

  3. Python推导式详解,带你写出比较精简酷炫的代码

    Python推导式详解,带你写出比较精简酷炫的代码 前言 1.推导式分类与用法 1.1 列表推导 1.2 集合推导 1.3 字典推导 1.4 元组推导?不存在的 2.推导式的性能 2.1 列表推导式与 ...

  4. Python 推导式详解

    各种推导式详解 推导式的套路 之前我们已经学习了最简单的列表推导式和生成器表达式.但是除此之外,其实还有字典推导式.集合推导式等等. 下面是一个以列表推导式为例的推导式详细格式,同样适用于其他推导式. ...

  5. Python 列表(List)操作方法详解

    Python 列表(List)操作方法详解 这篇文章主要介绍了Python中列表(List)的详解操作方法,包含创建.访问.更新.删除.其它操作等,需要的朋友可以参考下   列表是Python中最基本 ...

  6. Python列表推导式和嵌套的列表推导式

    列表推导式提供了一个更简单的创建列表的方法.常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表,或者通过满足某些特定条件元素来创建子序列. 例如,假设我们想创建一个平方 ...

  7. python 列表推导式 - python基础入门(16)

    截止到目前为止,python基础内容已经学习了50%左右,在学习编程过程中,我们不仅要学习python语法,同时也需要学习如何把自己代码写的更美观,效率更高. 一.什么是推导式 推导式是从一个或者多个 ...

  8. python数据类型详解及列表字典集合推导式详解

    一.运算符 Python语言支持以下类型的运算符: 算术运算符 如: #!/usr/bin/env python # -*- coding:utf-8 -*- a = 5 b = 6 print(a ...

  9. python全栈开发从入门到放弃之推导式详解

    variable = [out_exp_res for out_exp in input_list if out_exp == 2] out_exp_res: 列表生成元素表达式,可以是有返回值的函数 ...

随机推荐

  1. ip地址转化代码实例

    /*@author: lgh@ * * */ #include <stdio.h> #include <string.h> #include <unistd.h> ...

  2. bzoj 3295 树套树

    比较裸,可以有好多的优化,比如根本没有删除的点没有加在树套树中的必要,预处理 出来每个不会被删除的值可以减少不少时间,也可以写成树状数组套平衡树,都会快很多 /******************** ...

  3. Maven搭建webService (三) 创建客户端---使用Apache CXF方式实现

    package test; import net.cc.web.server.HelloWorld; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean ...

  4. 【翻译】Sencha Touch2.4 The Layout System 布局

    [翻译]The Layout System 布局 In Sencha Touch there are two basic building blocks: componentsand containe ...

  5. Android 4.4 KitKat, the browser and the Chrome WebView

    Having V8 as the JavaScript engine for the new web view, the JavaScript performance if much better, ...

  6. jQuery打印插件PrintArea实现

    实现javascript打印功能,打印整个页面就很简单,但如果指定打印某一个区域就有点难点,这里有一个jQuery插件PrintArea可实现打印页面某区域功能. 使用说明需要使用jQuery库文件和 ...

  7. hdu 1250 Hat's Fibonacci(java,简单,大数)

    题目 java做大数的题,真的是神器,来一道,秒一道~~~ import java.io.*; import java.util.*; import java.math.*; public class ...

  8. 【蛙蛙推荐】Lucene.net试用

    [蛙蛙推荐]Lucene.net试用   [简介] lucene.net好多人都知道的吧,反正我是最近才好好的看了一下,别笑我拿历史当新闻哦,不太了解Lucence的朋友先听我说两句哦.Lucene的 ...

  9. POJ 3384 Feng Shui(半平面交向内推进求最远点对)

    题目链接 题意 : 两个圆能够覆盖的最大多边形面积的时候两个圆圆心的坐标是多少,两个圆必须在多边形内. 思路 : 向内推进r,然后求多边形最远的两个点就是能覆盖的最大面积. #include < ...

  10. 离开csdn来到blog园

    csdn里没有限制阅读访问的功能,所以我选择来到cnblog 但是不得不说,cnblog做的界面很丑,我个人很不喜欢,但是没办法