2010-11-20 140 views
6

在这个片段的Python代码的样子,我这样写道:有没有更好的方法来做这个Python代码?

return map(lambda x: x[1], 
      filter(lambda x: x[0] == 0b0000, 
        my_func(i) 
       ) 
     ) 

(希望能这是不言自明)

我想知道如果Python有一个更好的方式来做到这一点?

几个月前我学了python,写了几个脚本,之后就没有用过。它使我处于一个奇怪的学习地点,因为我足够了解我想做的事情,但没有新手本能去找到“正确”的方式。我希望这个问题会放我回到正轨......

+0

我想'my_func,并将()'返回一个列表的列表? – 2010-11-20 01:21:29

回答

9

我想你想的列表理解:

[x[1] for x in my_func(i) if x[0] == 0] 

列表解析是一个非常普遍的Python习惯用法。

2

您可以使用类似:

return [x[1] for x in my_func(i) if x[0] == 0b0000] 

很多人会称之为“好”作为自己的短一点,更明显。

(。我会受到诱惑而考虑把它变成一个简单的循环,如果声明函数式编程是好的,但简单的循环是好的太)

+0

“for”循环如何更好或更明显?一旦你习惯了,列表理解的可读性要高得多。 – aaronasterling 2010-11-20 01:30:06

+1

你打算分配'x [0]'吗?或者这是否意味着'=='? – 2010-11-20 01:30:48

+1

@Russell Dias:他的意思是'==',因为它的语法错误,否则。 – 2010-11-20 01:46:27

1

如果您在Python 3.x的写作,那么你可以写一个高效发电机表达式,比如这个:return (x[1] for x in my_func(i) if not x[0])

+5

你为什么说“Python 3.x”?这在Python 2中可以正常工作。 – 2010-11-20 01:56:08

+0

Python 2.x和3.x中的'map'有区别。上次我检查时,2.x中的'map'返回了一个列表,但在3.x中就像一个生成器。 – 2010-11-20 22:04:33

1

在蟒蛇3.x中,你可以使用拆包避免使用x[0]x[1]。 你也可以考虑返回一个生成器表达式,而不是一个列表的理解,如果你只想遍历结果一次:

return (y for x,y,*z in my_func(i) if x == 0b0000)