python列表中的推导式_深入理解Python中的列表推导式(List Comprehensions)

列表推导式List Comprehensions在Python中通常用于编写单行语句,这些语句通过循环访问可迭代对象来创建新列表或字典。 本文将首先介绍有关for循环在Python中的工作原理,然后说明如何在Python中使用列表推导式。

在Python中的For循环

Python中的for循环语句按顺序遍历任何对象,列表,字符串等的成员。与其他编程语言相比,它的语法更加简洁,不需要手动定义迭代步骤并开始迭代。 尽管有多种方法可以使其行为与其他编程语言相同(本文不会介绍)。 您还可以通过使用诸如continue,break,pass等语句对for循环进行一些控制。以下是Python中for循环的简单示例:

>>> for a in range(10):

...  print(a)

上面的for循环将打印从0到9的十个数字。

列表推导式

列表推导式只不过是在一行语句中编写多行for循环的一种简写方法。下面的列表推导式示例将创建一个新列表[0、1、2、3、4、5、6、7、8、9],其中包含所有的“a”值。

>>> numbers = [a for a in range(10)]

>>> print (numbers)

请注意,列表推导式始终会创建一个新列表,并且不会修改表达式中使用的原始可迭代对象。 典型的列表推导式表达式必须具有“ for”子句,并且可以后接“ if”和“ else”条件语句。 在不使用列表推导式的情况下,以上示例将以以下方式编写:

>>> numbers = []

>>> for x in range(10):

...  numbers.append(x)

...

>>> print (numbers)

性能和可读性

列表推导式比for循环快。 但是,除非您要遍历成千上万的项目,否则您不会注意到性能上的重大改进。 尽管列表推导式为循环编写提供了一种简洁的方法,但是复杂的表达式可能会导致代码的可读性较差和冗长。 保持代码可读性很重要,除非实现程序的绝对必要的性能是最高。

示例:对字典和集合使用列表推导式语法

Python字典是键-值对中定义的元素的集合,而集合是不允许重复的唯一值的集合。列表推导式也可以与Python字典和集合一起使用。 语法略有不同,您现在必须使用花括号,而不是将表达式用方括号括起来。 您还将获得一个新的字典/集合对象,而不是一个新的列表。

>>> data = {"linuxidc": "linuxidc.com", "linux": "python"}

>>> idc_data = {a: b.title() for a,b in data.items()}

>>> print (idc_data)

如果不使用字典推导式(dictionary comprehensions),代码将如下所示:

>>> data = {"linuxidc": "linuxidc.com", "linux": "python"}

>>> idc_data = {}

>>> for a, b in data.items():

...  idc_data[a] = b.title()

...

>>> print (idc_data)

{'linuxidc': 'Linuxidc.Com', 'linux': 'Python'}

由于集合中没有键值对,因此可以按照与列表推导式相同的方式定义集合理解。 唯一的区别是使用花括号。

示例:列表推导式中的多个For循环

上面提到的列表理解示例是基本的,并使用单个“ for”语句。 下面是一个使用多个for循环和条件“ if”语句的示例。

>>> os = ["linux", "Ubuntu", "debian", "CentOS"]

>>> site = ["linuxidc", "uc", "dell", "python"]

>>> mingchen = [a + " " + b for a in os for b in site if b.startswith(a[0])]

>>> print (mingchen)

该代码将显示['linux linuxidc', 'ubuntu uc', 'debian dell']作为输出。 两个for循环遍历“os”和“sit”列表,并且两个单词的首字母相同时,它们的成员使用空格连接在一起。 不使用列表推导式,代码如下所示:

>>> os = ["linux", "ubuntu", "debian", "centos"]

>>> site = ["linuxidc", "uc", "dell", "python"]

>>> mingchen = []

>>> for a in os:

...  for b in site:

...    if b.startswith(a[0]):

...      mingchen.append(a + " " + b)

...

>>> print (mingchen)

示例:带有if-else子句的列表推导式

下面的示例将显示列表推导式中if和else语句的用法。

>>> linux_list = [1, 2, 3, 4, 5]

>>> idc_list = [6, 7, 8, 9, 10]

>>> result = [True  if (a + b) % 2 == 0 else False for a in linux_list for b in idc_list]

>>> print (result)

在遍历两个列表时,上面的列表理解检查这对元素的总和是否为偶数。 运行上面的代码将为您显示[False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False]作为输出。 不使用列表推导式,代码如下所示:

>>> linux_list = [1, 2, 3, 4, 5]

>>> idc_list = [6, 7, 8, 9, 10]

>>> result = []

>>> for a in linux_list:

...  for b in idc_list:

...    if (a + b) % 2 == 0:

...      result.append(True)

...    else:

...      result.append(False)

...

>>> print (result)

总结

列表推导式提供了一种编写简洁循环语句的好方法。但是,如果使用多个循环和条件语句,它们可能很快变得复杂和难以理解。不过编写显式、可读、易于调试的代码是一个好习惯,而不是过度使用缩写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值