美文网首页Python列表生成
Python 如何写复杂的列表生成式

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

作者: 46e30b30ea3f | 来源:发表于2017-04-24 22:44 被阅读36次

    我们首先实现一个在二维列表中找 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 中已经修复了这个问题

    相关文章

      网友评论

      本文标题:Python 如何写复杂的列表生成式

      本文链接:https://www.haomeiwen.com/subject/julmzttx.html