列表解析——用来动态地创建列表

[expr for iter_var in iterable if cond_expr]

例子一:

map(lambda x: x**2, range(6))

[0, 1, 4, 9, 16, 25]
[x**2 for x in range(6)]

[0, 1, 4, 9, 16, 25]

列表解析式可以取代内建的map()函数以及lambda,而且++效率更高++。

例子二:

seq = [11, 10, 9, 8, 7, 6]

filter(lambda x: x % 2, seq)

[11, 9, 7]
[x for x in seq if x % 2]

[11, 9, 7]

例子三:

找出文本中最长的词

# 第一个最长的词
longest = ''
for word in text:
if len(word) > len(longest):
longest = word
#所有最长的词
maxlen = max(len(word) for word in text) # 生成器表达式 [word for word in text if len(word) == maxlen] #链表推导式

不足: 列表解析得一个不足就是必要生成所有数据,用于创建整个列表。这可能对有大量数据得迭代其有负面效应。

++解决方法++:生成器表达式,通过结合列表解析和生成器解决了这个问题。

嵌套列表推导式

例一

all_data = [[1,3,5,7,9],
[2,4,6,8,10]] result = []
for nums in all_data:
temp_num = [num for num in nums if num >= 5]
result.extend(temp_num)

嵌套列表推导式

result = [num for nums in all_data for num in nums if num >= 5]

推导式中for的部分是按嵌套顺序排列的。

例二

some_tuples = [(1,2,3), (4,5,6), (7,8,9)]

flattened = [x for tup in some_tuples for x in tup]

flattened
[1,2,3,4,5,6,7,8,9]

列表解析配合if else

列表解析总共有两种形式:

1. [i for i in range(k) if condition]:此时if起条件判断作用,满足条件的,将被返回成为最终生成的列表的一员。

2. [i if condition else exp for exp]:此时if...else被用来赋值,满足条件的i以及else被用来生成最终的列表。

以上情况对多个for仍然成立。

print([i for i in range(10) if i%2 == 0])
print([i if i == 0 else 100 for i in range(10)]) [0, 2, 4, 6, 8]
[0, 100, 100, 100, 100, 100, 100, 100, 100, 100]

参考来源:http://blog.csdn.net/shingle_/article/details/55050701

     http://blog.csdn.net/zk_j1994/article/details/72809260

Python - 列表解析式的更多相关文章

  1. [翻译]Python List Comprehensions: Explained Visually || Python列表解析式

    原文1地址: http://treyhunner.com/2015/12/python-list-comprehensions-now-in-color/ 原文2地址: http://blog.tea ...

  2. python列表解析式,字典解析式,集合解析式和生成器

    一.列表解析式(列表推倒式): 功能:是提供一种方便的列表创建方法,所以,列表解析式返回的是一个列表. 1 lst = [1, 3, 5, 8, 10] 2 ll = [x+x for x in ls ...

  3. Python 列表解析式竟然支持异步?

    PEP原文:https://www.python.org/dev/peps/pep-0530 PEP标题:PEP 530 -- Asynchronous Comprehensions PEP作者:Yu ...

  4. Python列表解析式的正确使用方式

    先来逼逼两句: Python 是一种极其多样化和强大的编程语言!当需要解决一个问题时,它有着不同的方法.在本文中,将会展示列表解析式 (List Comprehension).我们将讨论如何使用它?什 ...

  5. Python列表解析式的正确使用方式(二)

    高级解析式 条件逻辑早些时候,我向您展示了这个公式: python学习交流群:660193417### new_list = [expression for member in iterable] 公 ...

  6. Python列表解析式的正确使用方式(一)

    先来逼逼两句: Python 是一种极其多样化和强大的编程语言!当需要解决一个问题时,它有着不同的方法.在本文中,将会展示列表解析式 (List Comprehension).我们将讨论如何使用它?什 ...

  7. [python] 列表解析式的高效与简洁

    方法一(列表解析式): list1 = ["abc","efg","hij"] list2 = [i[0] for i in list1] ...

  8. Python - 列表解析式/生成器表达式

    列表解析式: [expr for iter_var in iterable if cond_expr] 生成器表达式: (expr for iter_var in iterable if cond_e ...

  9. [转]Python 的列表解析式,集合解析式,字典解析式

    Python 的列表解析式,集合解析式,字典解析式 这三种都是 python 里面的语法糖. 语法糖,Syntactic Sugar,就是为了写程序时候少出错,发明的一些简便的方法,但不影响这个语法的 ...

随机推荐

  1. [20170909]为什么是12秒.txt

    [20170909]为什么是12秒.txt --//在开发程序时我一般会强调开发尽量不要写一些自定义函数,往往可能导致CPU忙.--//例子很像这样: CREATE OR REPLACE FUNCTI ...

  2. 将 Azure 文件共享用于 Windows VM

    可将 Azure 文件共享用作一种从 VM 中存储和访问文件的方式. 例如,你可以存储一个要与所有 VM 共享的脚本或应用程序配置文件. 本主题将介绍如何创建和装载 Azure 文件共享,以及如何上传 ...

  3. Xamarin是无懈可击还是鸡肋?浅谈对Xamarin的学习

    微软宣布跨平台已经有几个年头,当C#代码可以在其他平台运行时,我相信对于每个热爱.net的程序猿还是十分欣慰的,最近工作需要在一直研究和学习.net的跨平台开发Xamarin,网上对其优点总结也是一大 ...

  4. 扩展BootstapTable支持TreeGrid

    (function ($) { 'use strict'; var sprintf = function (str) { var args = arguments, flag = true, i = ...

  5. SVN与Git比较的优缺点差异

    目录: SVN与Git比较(一)集中式vs分布式 SVN与Git比较(二)版本库与工作区 SVN与Git比较(三)全局版本号和全球版本号 SVN与Git比较(四)部分检出 SVN与Git比较(五)更新 ...

  6. Apache的配置详解 带图

    对Apache 的 Http.conf 各项配置详解 1.01 ServerRoot 配置 [ServerRoot "" 主要用于指定 Apache 的安装路径,此选项参数值在安装 ...

  7. logstash启动失败的问题追查

    在实验中logstash是作为日志过滤器的作用,日志收集使用的则是filebeat组件.redis作为缓存器,logstash从redis中拉取数据进行过滤并传给elasticsearch组件. 但是 ...

  8. 01LaTeX学习系列之---TeX的介绍与认识

    目录 01TeX的介绍与认识 目录 前言 (一)TeX 的宣传 TeX - Beauty and Fun 1. TeX 是什么? 2. TeX 是哪家公司生产的? 3. 我们今天主角的名字怎么念啊?& ...

  9. Django 使用mysql 数据库流程

    创建一个mysql数据库 在settings中配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': ...

  10. c++11の多线程应用

    std::thread 应用十分方便,通过#include<thread>引入 std::thread t(subFunction); t.join(); 主线程将等待子线程完成后,继续调 ...