python——双重列表推导式+函数,优雅而强大

来源:互联网 发布:淘宝卖家更换支付宝 编辑:程序博客网 时间:2024/06/08 04:21

看书的过程中,看到了这种精妙(书里译文如此)的用法。

使用场景如下:

列表ls:

ls = [('x',['open1','open1','open1']),('y',['open1','open1','open0']),('z',['open0','open0','open1'])]

我们定义了一个列表,里面的元素是元祖,元祖里还有列表。
假设x,y,z是三串钥匙,对应三扇门,open1代表能打开,open0代表不能打开。我们要找出三扇门都能打开的那把钥匙,怎么解决?

使用列表推导式,非常容易,代码如下:

def find(con):    return [j for i in con for j in i if j.isdigit()][w for w,con in ls if find(con)==['1','1','1']]
结果是['x']。

自定义了一个函数find(),在内含条件的列表推导式中被调用,函数内部还有一个双层嵌套循环。

先看[w for w,con in ls],之前的帖子中介绍过列表推导式的用法,这里简单给一个小例子:[val+1 for val in [1,2,3]],结果是[2,3,4],所以for w,con in ls就是循环列表ls,w代表里面元祖的第一个元素,con是第二个元素,随后对每个con调用函数find。con传进find后,[j for i in con for j in i if j.isdigit()],先循环con,相当于取到了每一把钥匙,然后再循环每一把钥匙,isdigit()函数会判断是不是数字,是数字的就会被取出。所以结果就出来了。


原创粉丝点击