Python 的列表解析式,集合解析式,字典解析式

这三种都是 python 里面的语法糖。

语法糖,Syntactic Sugar,就是为了写程序时候少出错,发明的一些简便的方法,但不影响这个语法的功能。

(我第一反应是 HP 里面的 chocolate frog,哈哈哈)

1. 列表解析式 list comprehension

通常我们定义有内容 list 时,想对内容进行一些计算再放进去,除了使用 for 循环迭代出列表内的元素,进行计算再放进去,还可以在列表内直接写解析式计算。

1.1 普通版:[expression for i in iterable]

比如,要求 1-10 的每个数字的算术平方根组成的集合。

用 for 循环的话:

lst = []
for i in range(1, 11):
i = i ** 0.5 #不用pow()是因为这样计算比较快
lst.append(i)

这样看起来就比较繁琐。

用列表解析式的话,就相当于把上面的内容都浓缩起来:

lst = [ i**0.5 for i in range(1,11) ]

这样看起来就很清爽,前面是要对 i 做的处理,后面是 i 从哪里迭代,这些都用中括号 [ ] 括起来,是生成一个列表。

1.2 进阶版 [expression for i in iterable if… for j in iterable if… …]

前面还是表达式,但是后面写的是双循环,还有判断条件,就是符合条件的再进前面的表达式。

比如,我想要 5 以内的单数,和 5 以内双数组成的所有二元组,然后把这些元组放在一个列表里。

用 for 循环的话:

lst = []
for i in range(1,6):
if i % 2 == 0:
continue
for j in range(1,6):
if j % 2 == 0:
lst.append((i,j)) lst
[(1, 2), (1, 4), (3, 2), (3, 4), (5, 2), (5, 4)]

巨繁琐,但是如果用列表解析式的话:

[(i,j) for i in range(1,6) if i % 2 for j in range(1,6) if not j % 2]
[(1, 2), (1, 4), (3, 2), (3, 4), (5, 2), (5, 4)]
#减量不减价,你值得拥有。

但是要注意,列表解析式里不能有 elif 等比较复杂的语法结构,如果实在不行,还是用 for 循环吧。

而且一定要注意效率,怎么用 if 来筛选数据。比如:

[(i,j) for i in range(1,6) if i % 2 for j in range(1,6) if not j % 2]

[(i,j) for i in range(1,6) for j in range(1,6) if i % 2 if not j % 2]
[(i,j) for i in range(1,6) for j in range(1,6) if i % 2 == 0 and j % 2 != 0]
#前者的效率要略高,因为前者在第一个循环时就做了判断,不符合的话,就不用迭代第二个循环。
#第二个和第三个是一个类型,两个if就是嵌套解构
#而且一定要注意逻辑,看自己想要的到底是什么

还有列表解析式前面的 expression 得是有输出的,这个输出的结果才能放进列表里。

[print(i) for i in range(3)]
0
1
2
[None, None, None]
#i倒是会出现,但这是print的功能,print没有返回值,所以列表里面全都是None。

2. 集合解析式

普通版:{expression for i in iterable}

进阶版 {expression for i in iterable if… for j in iterable if… …}

用法和列表解析式是一样的,就是把中括号 [] 换成大括号 {}

需要注意得是,集合解析式,最终生成的也是集合,集合里面的元素必须是 hashable。所以这样是不行的:

{ [i] for i in range(5) }
#这样生成的元素都是list,不可hash,会报错

集合解析式也能自动去重(不能就怪了):

{i for i in [1,1,1,1,1,1]}
{1}

3. 字典解析式

用法还是和前两者一样,区别就是:用 { } 包起来,而且前面的 expression 得是 key:value 的形式。

{i:[j] for i in range(3) for j in 'abc'}
{0: ['c'], 1: ['c'], 2: ['c']} #注意key是去重的,所以第一个循环的元素带入第二个循环时,会与第二个循环的最后一个元素组成key:value #key必须可hash,但是value不需要hashable,所以value可以用可变的数据结构

[转]Python 的列表解析式,集合解析式,字典解析式的更多相关文章

  1. Python中列表,元组,字典,集合的区别

    参考文档https://blog.csdn.net/Yeoman92/article/details/56289287 理解Python中列表,元组,字典,集合的区别 列表,元组,字典,集合的区别是p ...

  2. Python中列表、元组、字典、集合与字符串,相关函数,持续更新中……

    本篇博客为博主第一次学 Python 所做的笔记(希望读者能够少点浮躁,认真阅读,平心静气学习!) 补充: 列表.元组和字符串共同属性: 属于有序序列,其中的元素有严格的先后顺序 都支持双向索引,索引 ...

  3. Python基础-列表、元组、字典、字符串

    Python基础-列表.元组.字典.字符串   多维数组 nums1 = [1,2,3] #一维数组 nums2 = [1,2,3,[4,56]] #二维数组 nums3 = [1,2,3,4,['a ...

  4. Python的列表推导式,字典推导式,集合推导式使用方法

    推导式分为列表推导式(list),字典推导式(dict),集合推导式(set)三种 1.列表推导式也叫列表解析式.功能:是提供一种方便的列表创建方法,所以,列表解析式返回的是一个列表格式:用中括号括起 ...

  5. Python基础-列表_元组_字典_集合

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...

  6. Day 15 python 之 列表、元组、字典

    基础: #! /usr/bin/env python # -*- coding: utf-8 -*- # __author__ = "DaChao" # Date: 2017/6/ ...

  7. Python3基础数据类型(数字、字符串、元组、列表、集合、字典)

    笔记参考了菜鸟教程 Python 中的变量不需要声明,赋值才创建.赋值给变量的是什么类型变量就是什么类型 多个变量赋值 1 a, b, c = 1, 2, "runoob" 标准数 ...

  8. Python学习---列表,元组,字典

    ### 列表 list = [1,2,3,4,5,6] list.append(7) print(list) ===>>> [1, 2, 3, 4, 5, 6, 7] list[2] ...

  9. python之列表,元组,字典。

    在博主学习列表,元组以及字典的时候,经常搞混这三者.因为他们都是用括号表示的.分别是[],(),{}. 列表(list): [1,'abc',1.26,[1,2,3],(1,2,3),{'age:18 ...

  10. Python列表、集合与字典(3)

    目录 一.列表 二.集合 三.字典 一.列表 1. 列表初识   列表的使用为处理特定顺序排列的数据提供了便利,列表元素可以是字母.数字或者其他信息,同时所加元素之间不存在任何关系.   在Pytho ...

随机推荐

  1. java-递归练习

    1.从键盘接收一个文件夹路径,统计该文件夹大小 public class Test1 { /** * @param args * 需求:1,从键盘接收一个文件夹路径,统计该文件夹大小 * * 从键盘接 ...

  2. 2017 cinemachine

    只有2017以上才可以使用~ 导入Asset store中的cinemachine,会在上方显示cinemachine.每创建一个虚拟摄像机,就会在主摄像机下创建组件  cinemachine Bra ...

  3. 学习笔记CB004:提问、检索、回答、NLPIR

    聊天机器人,提问.检索.回答. 提问,查询关键词生成.答案类型确定.句法和语义分析.查询关键词生成,提问提取关键词,中心词关联扩展词.答案类型确定,确定提问类型.句法和语义分析,问题深层含义剖析.检索 ...

  4. 2019CVTE技术支持软件编程

    题目:找出长度为M的数组S中求和为1的任意三个数组合个数,举例:S=[-2, 0, 1, 2, -1, 3],结果为:3个([-2, 0, 3], [-2, 1, 2], [0, 2, -1]). 思 ...

  5. Linux----------nfs服务器的搭建及常识

    一.nfs简介 nfs(network file system)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源. nfs主要适用用linu ...

  6. linux一些工具的安装(二)

    一.Linux下安装lrzsz上传下载工具 1:使用yum安装 yum -y install lrzsz  要有网络才行 输入命令:rz启动文件上传 2:手动编译安装 1. 下载安装包,wget ht ...

  7. Django学习笔记之验证和授权

    验证和授权概述 Django有一个内置的授权系统.他用来处理用户.分组.权限以及基于cookie的会话系统.Django的授权系统包括验证和授权两个部分.验证是验证这个用户是否是他声称的人(比如用户名 ...

  8. Qt applendPlainText()/append() 多添加一个换行解决方法

    Qt applendPlainText()/append() 多添加一个换行解决方法 void ConsoleDialog::appendMessageToEditor(const QString & ...

  9. Btrace 拦截时机

    Kind.ENTRY 入口,默认值 Kind.RETURN:  返回 Kind.THROW: 异常 Kind.Line: 行 一.返回时拦截 package com.example.monitor_t ...

  10. opcache 参数说明 --转自https://www.cnblogs.com/tudou1223/p/5362785.html

    PHP的opcode缓存又出了新成员(说新不新,也有一段日子了),那就是opcache.新浪微博等都在使用,惠新宸老师强力推荐.本人最近根据官网地址(http://www.php.net/manual ...