私はPythonのdictionary.get(key, default)
forリストに相当するものを探しています。リストのn番目の要素を取得するための1つのライナーイディオムまたは利用できない場合のデフォルト値はありますか?
たとえば、取得したいリストmyList myList[0]
またはmyList
空のリストの場合は5を指定します。
ありがとう。
私はPythonのdictionary.get(key, default)
forリストに相当するものを探しています。リストのn番目の要素を取得するための1つのライナーイディオムまたは利用できない場合のデフォルト値はありますか?
たとえば、取得したいリストmyList myList[0]
またはmyList
空のリストの場合は5を指定します。
ありがとう。
回答:
l[index] if index < len(l) else default
負のインデックスをサポートするために使用できます:
l[index] if -len(l) <= index < len(l) else default
index == -1000000
戻る必要がありdefault
ます。
x[index] if 0 <= index < len(x) else default
なることができればもっと良いでしょうindex
。
valid_index()
が正しくありません。負のインデックスは Pythonでは合法です-あるべきです-len(l) <= index < len(l)
。
try:
a = b[n]
except IndexError:
a = default
編集:TypeErrorのチェックを削除しました-おそらく呼び出し元にこれを処理させる方が良いでしょう。
(a[n:]+[default])[0]
a
大きくなるにつれてこれはおそらくより良いです
(a[n:n+1]+[default])[0]
これa[n:]
は機能します。n => len(a)
これがどのように機能するかの例です range(5)
>>> range(5)[3:4]
[3]
>>> range(5)[4:5]
[4]
>>> range(5)[5:6]
[]
>>> range(5)[6:7]
[]
そして完全な表現
>>> (range(5)[3:4]+[999])[0]
3
>>> (range(5)[4:5]+[999])[0]
4
>>> (range(5)[5:6]+[999])[0]
999
>>> (range(5)[6:7]+[999])[0]
999
next(iter(lst[i:i+1]), default)
-謎めいた醜いワンライナーコンテストのもう1つのエントリ。
ちょうどそれを発見しました:
next(iter(myList), 5)
iter(l)
イテレータを返します myList
、next()
反復子の最初の要素を消費し、上昇しStopIteration
、ここでは二番目の引数の場合で、デフォルト値、と呼ばれている場合を除き、エラーを5
これは、例のように最初の要素が必要な場合にのみ機能しますが、質問のテキストでは機能しないため、...
さらに、メモリに一時的なリストを作成する必要はなく、名前がなくても、あらゆる種類のイテラブルで機能します(gruszczyの回答に関するXiong Chiamiovのコメントを参照)
next(iter(myList[n:n+1]), 5)
はn
th要素に対して機能します。
try
バリアントは(OPによりを求め頼む)ワンライナーではありません。myList
はOPで指定されたリストであるため、リストに対してのみ機能します(正確には、インデックス可能なものです)。ここでは1つの(または何もない)要素のリストを作成しているので、メモリ内にコピーを作成してもコストはかかりません。確かに、少しオーバーヘッドがありますが、ループで何百万回も実行しない限り、言及する価値はありません。ところで、IndexError
例外の作成とキャッチはおそらくもっとコストがかかると思います。
(L[n:n+1] or [somedefault])[0]
[] or ...
したかを学びに行きました。しかし、私は個人的には、(初心者にとって)簡単に読めるので、受け入れられたソリューションを使用します。確かに、それをコメント付きの 'def'でラップすると、ほとんど問題にならないでしょう。
L[n] == False
か、L[n] == None
またはL[n] == []
以上のグローバル何falseと評価こと?
[False]
真です。
myval = l[n:n+1] or [somedefault]
うまくいくと思いますか?
...
dict.get(key, default)
forリストのPythonで同等のものを探しています
一般的なイテラブルに対してこれを行うitertoolsレシピがあります。便宜上、> pip install more_itertools
このようなレシピを実装する次のサードパーティライブラリをインポートできます。
コード
import more_itertools as mit
mit.nth([1, 2, 3], 0)
# 1
mit.nth([], 0, 5)
# 5
細部
これがnth
レシピの実装です:
def nth(iterable, n, default=None):
"Returns the nth item or a default value"
return next(itertools.islice(iterable, n, None), default)
のようにdict.get()
、このツールは欠落しているインデックスのデフォルトを返します。これは一般的なイテラブルに適用されます:
mit.nth((0, 1, 2), 1) # tuple
# 1
mit.nth(range(3), 1) # range generator (py3)
# 1
mit.nth(iter([0, 1, 2]), 1) # list iterator
# 1