列表(list)作为python最基础也是最重要的数据类型之一,在python数据分析以及其他用途中有着重要的作用。


本文是 Python数据类型-List介绍(上) 的姊妹篇。


通过这两篇文章来对List做一个相对系统的介绍,希望对于熟悉list有所帮助。


 Start 


本文的运行环境:

  • windows7系统

  • python3.5

  • jupyter notebook



6 列表推导式(List Comprehension)

6.1 列表推导式的一般情况

列表推导式的一般语法结构:

new_list = [for x in iterable]

其中的 iterable 表示可迭代的对象,包括字符串(str)、列表(list),元组(tuple)、字典(dict)、集合(set),以及生成器(generator)等。

先来看几个简单的例子:

str_list = [x.lower() for x in "Lemon"]str_list
['l', 'e', 'm', 'o', 'n']
list_list = [x**2 for x in [1,2,3,4]]list_list
[1, 4, 9, 16]
tuple_list = [x+2 for x in (1,2,3,4)]tuple_list
[3, 4, 5, 6]
ge_list = [x for x in range(8)]ge_list
[0, 1, 2, 3, 4, 5, 6, 7]

6.2 两层for循环的列表推导式

列表推导式中,可以同时包含多个for循环,比如同时两个for循环,如下:

[x**2+y for x in range(5) for y in range(4,7)]
[4, 5, 6, 5, 6, 7, 8, 9, 10, 13, 14, 15, 20, 21, 22]

上述结果跟下面的写法结果是一致的:

two_for_list = []for x in range(5):    for y in range(4,7):        two_for_list.append(x**2+y)print(two_for_list)
[4, 5, 6, 5, 6, 7, 8, 9, 10, 13, 14, 15, 20, 21, 22]

列表推导式中,三层或者三层以上的for循环一般很少用到。

6.3 使用两个变量来生成list

列表推导式也可以使用两个或多个变量来生成list,结合字典的使用,举例如下:

d = {'x': '1', 'y':'2', 'z':'4'}d_list = [k+'='+v for k,v in d.items()]d_list
['z=4', 'y=2', 'x=1']

6.4 含if语句的列表推导式

列表推导式中还可以引入 if 条件语句,如下:

if_list = [x**2 for x in range(10) if x%2==0]if_list
[0, 4, 16, 36, 64]

上述列表推导式,如果用普通的for循环来编写的话,内容如下:

if_list = [x**2 for x in range(10) if x%2==0]if_list
[0, 4, 16, 36, 64]

通过对比,可以看出列表推导式的方式更显得 Pythonic。

当然,如果仅仅是编写上更简洁,可能不一定能显现出 列表推导式的优势,下面我们来对比下上述两种方式的运行效率。

%%timeitif_list = [x**2 for x in range(10) if x%2==0]if_list
100000 loops, best of 3: 6.06 µs per loop
%%timeitdef for_loop():    if_list_1 = []    for x in range(10):        if x%2==0:            if_list_1.append(x**2)    return if_list_1for_loop()
100000 loops, best of 3: 6.76 µs per loop

从上面的运行结果进行对比,可以看出列表推导式的运行效率要高于普通的 for循环编写方式。

因为,建议大家使用列表推导式,不仅写法更 Pythonic,且运行效率更高。

包含if-else语句的列表推导式

[x**2 if x%2==0 else x+2 for x in range(10)]
[0, 3, 4, 5, 16, 7, 36, 9, 64, 11]

包含两个if语句的列表推导式

[x**2 for x in range(10) if x%2==0 if x%3==0]
[0, 36]

7 小结

如果想获取离散的元素,比如想获得第1、2、4个元素,能不能通过离散的索引值来获取呢?

前面已经实践过,直接通过离散的索引值来获取列表中的元素是不行的。

通过列表推导式的学习,我们可以换一种思路,来实现列表中离散的元素的获取,如下:

[c_list[i] for i in [0,1,3]]
['James', 'Ava', 'Emma']

列表(list)作为python最基础也是最重要的数据类型之一,在python数据分析以及其他用途中有着重要的作用,希望上述内容能对于熟悉list有所帮助。


如果您喜欢我的文章,欢迎推荐给您的朋友!


 End 




公众号导航

ID:PyDataRoad



  • 微信公众号后台回复数字「 8 」,访问个人官网。

  • 微信公众号后台回复数字「 1 」,获取公众号导航内容,包括部分文章源代码,精华文章等。

  • 在微信公众号后台回复「 微信群 」,和小伙伴们一起入群。



©著作权归作者所有:来自51CTO博客作者mb5fe18e7c44408的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Selenium自动化|爬取公众号全部文章,就是这么简单
  2. 今天我的公众号改名字啦!
  3. 动画:散列表 | 文本编辑器是如何检查英文单词出错的?
  4. PHP微信公众号支付教程(含图文)
  5. 教你用PHP开发微信公众号文章付费阅读功能
  6. PHP基础案例四:展示学生列表
  7. 速看!php artisan 命令列表
  8. php怎么接入公众号
  9. 格式化聊天列表时间

随机推荐

  1. 详细介绍XSLT模板转换XML文档的代码案例
  2. 详细介绍解析Xml四种方法的示例代码
  3. 详细介绍测试几个xml的问题的案例
  4. XML布局文件的代码案例分享
  5. JS读取XML数据的示例代码分享
  6. 具体介绍使用XmlReader读取xml文件的代码
  7. 详解XML中Node和Element区别的示例代码
  8. Xml序列化的图文代码详解
  9. XML学习(三) js保存xml的示例代码分享
  10. XML串行化的示例代码分享