会晤推导式,字典推导式与聚集推导式用法实例分析

By admin in 4858.com on 2019年4月9日

推导式 comprehensions(又称解析式):是 Python
中很有力的、很受欢迎的风味,具有语言简明,速度快等优点。推导式包涵:

正文实例讲述了Python列表推导式、字典推导式与聚集推导式用法。分享给我们供我们参考,具体如下:

列表生成式:会将兼具的结果壹切总结出来,把结果存放到内部存款和储蓄器中,倘诺列表中数据比较多,就会占有过多的内部存储器空间,恐怕会促成MemoryError内部存款和储蓄器不当可能造成程序在运营时出现卡顿的情状

推导式comprehensions(又称解析式),是Python的一种独有特色。推导式是足以从3个数目种类营造另一个新的数据连串的结构体。

1. 列表推导式
2. 字典推导式
3. 集合推导式

推导式comprehensions(又称解析式),是Python的壹种独有特色。推导式是足以从贰个数码连串营造另一个新的多寡体系的结构体。
共有两种推导,在Python2和3中都有支撑:

列表生成器:会创设3个列表生成器对象,不会一回性的把拥有结果都总计出来,假若急需获取数据,能够行使next()函数来获得,可是须求小心,壹旦next()函数获取不到数码,会导致出现StopIteration非常错误,能够使用for循环遍历列表生成器,获取具有数据

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

对以上的三种推导式分别举例分析:

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

亟需视情形而定,假若数据量比较大,推荐使用生成器

列表推导式

壹、列表推导式


1、列表推导式

 python2.7中就是range(生成式) 和 xrange(生成器)的区别

一、使用[]生成list

会晤推导式,字典推导式与聚集推导式用法实例分析。大旨格式

var = [expression for item in iterable if condition]
expression        # 列表生成元素表达式,可以是有返回值的函数。
for item in iterable    #迭代iterable将item传入expression表达式中。
if condition    #根据条件过滤数据,生成想得到的数据

eg:列表生成式

var =[item for item in range(10) if item % 2 == 0]
print(var)

# 输出
[0, 2, 4, 6, 8]      # 输出为列表

 

二、使用()生成generator

将列表推导式的 [] 换到 () 即可获得  生成器

eg:生成器表明式

gen=('egg%s' %i for i in range(10) if i > 5)
print(gen)
print(list(gen))

# 输出
<generator object <genexpr> at 0x7f4b7c219d58>  # 生成器对象
['egg6', 'egg7', 'egg8', 'egg9']     # 生成器内的数据

 

 

1、使用 [] 生成 list

例如:

list = [ i for i in range(20) if i%2 == 0 ]
print(list)

#output:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

1、使用[]生成list

列表生成式是十分的快生成三个列表的1些公式

字典推导式

字典推导和列表推导的施用方法是接近的,只不中括号该改成大括号。直接举例表达

eg:大小写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

# 输出结果
 {'a': 17, 'b': 34}

eg:神速更换key和value

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

# 输出结果
{10: 'a', 34: 'b'}

 

2、使用 () 生成 generator

将列表推导式的 [] 换到 () 即可获得生成器。

generator = ( i for i in range(20) if i%2 == 0 )
print(generator)

#output:<generator object <genexpr> at 0x0000000000B5CA40>

经过 next() 就足以依次调用生成器中的数据。

大旨格式

在列表中存放0~100的数:

晤面推导式

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

eg:

squared = {x**2 for x in [1, 1, 2]}
print(squared)
# 输出结果
# set([1, 4])

 

贰、字典推导式


留存 key 和 value,使用的是 {}。

dic = { "A":1, "b":2, "C":3, "d":4 }
new_dic = { k:v for k,v in dic.items() if k <= 'a'}
print(new_dic)

#output:{'C': 3, 'A': 1}

variable = [out_exp_res for out_exp in
input_list if out_exp == 2]

平日的列表生成:

三、集合推导式


它跟列表推导式也是接近的。不一样在于它应用大括号
{},并且数据是严节和无重复的。

Set = { i**2 for i in [1,2,3,4,5,3] }
print(Set)

#output:{16, 1, 4, 9, 25}

out_exp_res:  列表生成成分表明式,能够是有再次来到值的函数。
for out_exp in
input_list:  迭代input_list将out_exp传入out_exp_res表明式中。
if out_exp ==
贰:  依照标准过滤哪些值能够。

numbers=[] 
for x in range(0,101): 
  numbers.append(x) 
print(numbers) 

例一:

用列表生成式生成列表:[要放入列表的数码    简单来评释式1   表达式二]

multiples = [i for i in range(30) if i % 3 is 0]
print(multiples)
# Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
#x for x in range(0,101) for循环遍历出来的值,放入列表中 
numbers=[x for x in range(0,101)] 
print(numbers) 

例二:

列表中存放0~100的偶数:

def squared(x):
  return x*x
multiples = [squared(i) for i in range(30) if i % 3 is 0]
print multiples
# Output: [0, 9, 36, 81, 144, 225, 324, 441, 576, 729]

普普通通方法生成列表:

2、使用()生成generator

for x in range(0,101): 
  if x%2==0: 
    numbers.append(x) 
print(numbers) 

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

用列表生成式生成列表:

multiples = (i for i in range(30) if i % 3 is 0)
print(type(multiples))
# Output: <type 'generator'>
#for循环遍历0~101的数字,如果数字对2取余==0,表示是偶数,x放在列表中 
numbers=[x for x in range(0,101)if x%2==0] 
print(numbers) 

二、字典推导式

找出列表list一=[‘asd’,’adf’,’dafg’,’acbo’]带有a的字符

字典推导和列表推导的施用格局是接近的,只不中括号该改成大括号。直接举例表达:

普普通通写法:

例子一:大小写key合并

rs_list=[] 
for s in list1: 
  if 'a' in s: 
    rs_list.append(s) 
print(rs_list) 
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}

列表生成式:

事例贰:快捷转移key和value

list2=[x for x in list1 if 'a' in x] 
mcase = {'a': 10, 'b': 34}
mcase_frequency = {v: k for k, v in mcase.items()}
print mcase_frequency
# Output: {10: 'a', 34: 'b'}

列表生成式辅助双层for循环

三、集合推导式

list3=[x*y for x in range(0,10) for y in range(20)] 
print(list3) 

它们跟列表推导式也是周围的。 唯一的差异在于它应用大括号{}。

生成器构造实例

例一:

# 使用类似列表生成式的方式构造生成器
g1 = (2*n + 1 for n in range(3, 6))

# 使用包含yield的函数构造生成器
def my_range(start, end):
  for n in range(start, end):
    yield 2*n + 1

g2 = my_range(3, 6)
print(type(g1))
print(type(g2))
squared = {x**2 for x in [1, 1, 2]}
print(squared)
# Output: set([1, 4])

出口结果:

愈来愈多关于Python相关内容感兴趣的读者可查阅本站专题:《Python列表(list)操作技能总计》、《Python数组操作技能总计》、《Python字符串操作技能汇总》、《Python函数使用技术总括》、《Python入门与进阶经典教程》及《Python数据结构与算法教程》

<class ‘generator’>
<class ‘generator’>

目的在于本文所述对大家Python程序设计具有辅助。

生成器的调用形式

你或然感兴趣的篇章:

  • Python列表推导式与生成器表明式用法示例
  • 基于Python列表解析(列表推导式)
  • Python列表推导式的应用格局
  • Python学习小技巧之列表项的推导式与过滤操作
  • Python列表生成式与生成器操作示例
  • Python三中的列表生成式、生成器与迭代器实例详解
  • python列表生成式与列表生成器的利用
  • 比方讲解Python中的迭代器、生成器与列表解析用法
  • 浅谈Python中列表生成式和生成器的界别
  • Python
    while、for、生成器、列表推导等说话的履行功效测试
  • Python列表推导式与生成器用法分析
  1. 要调用生成器发生新的因素,有二种方式:
  2. 调用内置的next()方法
  3. 选用循环对生成器对象开始展览遍历(推荐)
  4. 调用生成器对象的send()方法

实例1:使用next()方法遍历生成器

print(next(g1))
print(next(g1))
print(next(g1))
print(next(g1))

出口结果:

7
9
11
Traceback (most recent call last):
  File “***4858.com,/generator.py”, line 26, in <module>
    print(next(g1))
StopIteration

print(next(g2))
print(next(g2))
print(next(g2))
print(next(g2))

出口结果:

7
9
11
Traceback (most recent call last):
  File “***/generator.py”, line 31, in <module>
    print(next(g2))
StopIteration

看得出,使用next()方法遍历生成器时,最后是以抛出1个StopIeration至极终止。

实例2:使用循环遍历生成器

for x in g1:
  print(x)

for x in g2:
  print(x)

多少个巡回的出口结果是均等的:

7
9
11

看得出,使用循环遍历生成器时比较短小,且最终不会抛出2个StopIeration万分。由此利用循环的措施遍历生成器的措施展才能是被推举的。

须要证实的是:假设生成器函数有再次来到值,要获得该再次回到值的话,只可以通过在二个while循环中频频的next(),最终经过捕获StopIteration分外

实例三:调用生成器对象的send()方法

def my_range(start, end):
  for n in range(start, end):
    ret = yield 2*n + 1
    print(ret)

g3 = my_range(3, 6)
print(g3.send(None))
print(g3.send('hello01'))
print(g3.send('hello02'))

输出结果:

7
hello01
9
hello02
11

print(next(g3))
print(next(g3))
print(next(g3))

输出结果:

7
None
9
None
11

结论:

  1. next()会调用yield,但不给它传值
  2. send()会调用yield,也会给它传值(该值将成为近来yield表明式的结果值)

内需留意的是:第三遍调用生成器的send()方法时,参数只能为None,不然会抛出尤其。当然也得以在调用send()方法在此之前先调用二遍next()方法,目标是让生成器先进入yield表明式。

生成器与列表生成式相比较

既是经过列表生成式就能够直接创建三个新的list,那么为何还要有生成器存在呢?

因为列表生成式是一向开立2个新的list,它会3回性地把具有数据都存放到内部存款和储蓄器中,那会设有以下多少个难点:

  1. 内部存款和储蓄器容积有限,因而列表体积是简单的;
  2. 当列表中的数据量十分大时,会占据大量的内部存款和储蓄器空间,如若大家无非要求拜访后面有限个因素时,就会促成内部存款和储蓄器能源的巨大浪费;
  3. 当数据量不小时,列表生成式的回来时间会极慢;

而生成器中的成分是依据钦赐的算法推算出来的,唯有调用时才转移对应的数码。那样就不必1遍性地把富有数据都转移,从而节省了大气的内部存款和储蓄器空间,那使得其生成的要素个数差不离是未有限制的,并且操作的归来时间也是丰富便捷的(仅仅是开创多个变量而已)。

我们得以做个试验:比较一下生成叁个一千万个数字的列表,分别看下用列表生成式和生成器时回来结果的时日和所占内部存款和储蓄器空间的尺寸:

import time
import sys

time_start = time.time()
g1 = [x for x in range(10000000)]
time_end = time.time()
print('列表生成式返回结果花费的时间: %s' % (time_end - time_start))
print('列表生成式返回结果占用内存大小:%s' % sys.getsizeof(g1))

def my_range(start, end):
  for x in range(start, end):
    yield x

time_start = time.time()
g2 = my_range(0, 10000000)
time_end = time.time()
print('生成器返回结果花费的时间: %s' % (time_end - time_start))
print('生成器返回结果占用内存大小:%s' % sys.getsizeof(g2))

输出结果:

列表生成式重临结果开销的大运: 0.8215489387512207
列表生成式再次回到结果占用内部存款和储蓄器大小:8152805陆
生成器重返结果开销的时刻: 0.0
生成器再次回到结果占用内部存款和储蓄器大小:8八

看得出,生成器重返结果的小运差不多为0,结果所占内部存款和储蓄器空间的深浅相对于列表生成器来说也要小的多。

如上便是本文的全体内容,希望对我们的求学抱有支持,也希望大家多多援救脚本之家。

你可能感兴趣的篇章:

  • Python列表推导式与生成器表达式用法示例
  • 听他们讲Python列表解析(列表推导式)
  • Python列表推导式、字典推导式与聚集推导式用法实例分析
  • Python列表推导式的施用办法
  • Python学习小技巧之列表项的推导式与过滤操作
  • Python列表生成式与生成器操作示例
  • Python三中的列表生成式、生成器与迭代器实例详解
  • 比喻讲解Python中的迭代器、生成器与列表解析用法
  • 浅谈Python中列表生成式和生成器的区分
  • Python
    while、for、生成器、列表推导等话语的推行效能测试
  • Python列表推导式与生成器用法分析

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有