80

リストを指定して、None 以外の最初の値を取得する方法はありますか? もしそうなら、そうするためのpythonicな方法は何でしょうか?

たとえば、私は持っています:

  • a = objA.addreses.country.code
  • b = objB.country.code
  • c = None
  • d = 'CA'

この場合、a が None なら、b を取得したいと思います。a と b が両方とも None の場合、I は d を取得したいと考えています。

現在、私は次のようなことを行っていますが(((a or b) or c) or d)、別の方法はありますか?

4

6 に答える 6

155

使用できますnext()

>>> a = [None, None, None, 1, 2, 3, 4, 5]
>>> next(item for item in a if item is not None)
1

StopIterationリストに None しか含まれていない場合、例外がスローされます。この場合にデフォルト値が必要な場合は、次のようにします。

>>> a = [None, None, None]
>>> next((item for item in a if item is not None), 'All are Nones')
All are Nones
于 2013-08-30T13:06:16.010 に答える
7

以下から適応します(必要に応じてワンライナーにすることもできます):

values = (a, b, c, d)
not_None = (el for el in values if el is not None)
value = next(not_None, None)

これは、最初の非None値を取るか、None代わりに返します。

于 2013-08-30T13:06:26.110 に答える