2015-12-18 68 views
1

這樣的:
如果列表['', 'a', 'b']回報'a'
如果列表['', '', '']回報''
如果列表是['a', 'b', 'c']a
是蟒蛇任何方法來做到這一點?
我的意思是不需要我寫函數自己
我想在javascriptpython如何在列表中返回first value = true?

+1

另外的可能重複https://stackoverflow.com/questions/18208730/shortcut-or-chain-applied-on-list,HTTPS:/ /stackoverflow.com/questions/1077307/why-is-there-no-firstiterable-built-in-function-in-python等 – ShadowRanger

回答

7

明顯的方式像var a = b || c內置的方法是使用一個發電機表達

>>> next(x for x in ['a', 'b', 'c'] if x) 
'a' 
>>> next(x for x in ['', 'b', 'c'] if x) 
'b' 

但是 - 全是假的引發例外的,而不是''

>>> next(x for x in ['', '', ''] if x) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 

可以解決這個問題提供了一個默認next這樣

>>> next((x for x in ['', '', ''] if x), '') 
'' 
0

我想象變種A = B內置方法|| Ç在JavaScript

Python的or作品幾乎是完全相同的方式,所以如果你在JavaScript中寫爲

result = arr[0] || arr[1] || arr[2]; 

那麼你可以做在Python如下:

result = l[0] or l[1] or l[2] 
3

直接從itertools recipes,Python認可的解決方案(如果您使用Py2,請將filter替換爲itertools.ifilter或者它不會正確短路):

def first_true(iterable, default=False, pred=None): 
    """Returns the first true value in the iterable. 

    If no true value is found, returns *default* 

    If *pred* is not None, returns the first item 
    for which pred(item) is true. 

    """ 
    # first_true([a,b,c], x) --> a or b or c or x 
    # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x 
    return next(filter(pred, iterable), default) 
0

下面是使用max尋常路。

>>> max(['a', 'b', 'c'], key=bool) 
'a' 
>>> max(['', 'b', 'c'], key=bool) 
'b' 
>>> max(['', '', ''], key=bool) 
'' 

缺點是,它不短路

+0

'key = bool'也可以工作(用'max',我的意思是,不是'min'--但總體思路相同) – DSM

+0

@DSM,對於學校來說太酷了:) –

+0

是的,正如我編輯澄清的那樣,您需要改用'max'。 – DSM