Python 如何写复杂的列表生成式

我们首先实现一个在二维列表中找 3 的倍数的例子:

In [1]: nested_list = [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]

In [2]: result = []

In [3]: for sublist in nested_list:
   ...:     for x in sublist:
   ...:         if x % 3 == 0:
   ...:             result.append(x)
   ...:             

In [4]: result
Out[4]: [0, 3, 6, 9]

In [5]: result = [x for sublist in nested_list for x in sublist if x % 3 == 0]

In [7]: result
Out[7]: [0, 3, 6, 9]

看到列表生成式很简洁,但是初学者往往写着很困难,这是因为没有找到 “窍门”,我们这种双层循环列表生成式其实掌握了方法很简单,仔细看列表生成式可以写成如下格式:

result = [x 
for sublist in nested_list
    for x in sublist
        if x % 3 == 0
]

看到其实和我们循环结构是一模一样的,只是写成了一行,掌握这个方法,就很容易的写出复杂的列表生成式,无论几层循环

值得注意的是,为了支持这种语法,列表生成式有一个奇怪的副作用,就是会泄露中间变量

In [1]: nested_list = [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]

In [2]: result = [x for sublist in nested_list for x in sublist if x % 3 == 0]

In [3]: x
Out[3]: 9

In [4]: sublist
Out[4]: [8, 9]

看到我们的 sublistx 是在列表生成式中定义的,但是在外面也可以访问,当然,Python3 中已经修复了这个问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,958评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,404评论 25 708
  • OC代码: JS代码: 总结:1.注意for in循环和for循环的区别,for in循环是一次性取出所有的元素进...
    anny_4243阅读 183评论 0 0
  • 作者:王之乐自明星塑造者 文章:来源于网络 任何一个社会,发展到一定程度都会分层。我今天想跟大家讨论的问题是:不同...
    之乐日记阅读 850评论 0 0
  • 我用心唱歌 可喉咙却不怎么配合 声从嘴喷出 却是满满的无奈 我想把思念融入 唱出此刻的心情 可沙哑的现实 立即打碎...
    无过雪中人阅读 118评论 2 1