a=['123','2',4]
b=a[4] or 'sss'
print b
リストインデックスが範囲外の場合にデフォルト値を取得したい(ここで'sss'
)。
これどうやってするの?
Python「許可ではなく、許しを求める」という精神で、ここに1つの方法があります。
try:
b = a[4]
except IndexError:
b = 'sss'
「許しではなく許可を求める」というPython以外の精神では、別の方法があります。
b = a[4] if len(a) > 4 else 'sss'
Python美しい精神はいよりも優れている
スライスとアンパックを使用したコードゴルフ法(4年前に有効であったかどうかはわかりませんが、python 2.7 + 3.3)
b,=a[4:5] or ['sss']
ラッパー関数やtry-catch IMHOよりも優れていますが、初心者には威圧的です。個人的には、Tupleのアンパックはリストよりもずっとセクシーだと思います[#]
解凍せずにスライスを使用する:
b = a[4] if a[4:] else 'sss'
または、これを頻繁に行う必要があり、辞書を作成してもかまわない場合
d = dict(enumerate(a))
b=d.get(4,'sss')
別の方法:
b = (a[4:]+['sss'])[0]
独自のリストクラスを作成できます。
class MyList(list):
def get(self, index, default=None):
return self[index] if len(self) > index else default
次のように使用できます。
>>> l = MyList(['a', 'b', 'c'])
>>> l.get(1)
'b'
>>> l.get(9, 'no')
'no'
これらの場合には、小さなヘルパー関数を定義することもできます:
def default(x, e, y):
try:
return x()
except e:
return y
タイプx
の例外を発生させない限り、関数e
の戻り値を返します。その場合、値y
を返します。使用法:
b = default(lambda: a[4], IndexError, 'sss')
編集:指定されたタイプの例外のみをキャッチするようにしました。
改善の提案は大歓迎です!
最初の要素が必要な一般的なケースでは、次のことができます
next(iter([1, 2, 3]), None)
これを使用して、おそらくフィルター処理した後にリストを「アンラップ」します。
next((x for x in [1, 3, 5] if x % 2 == 0), None)
または
cur.execute("SELECT field FROM table")
next(cur.fetchone(), None)
try:
b = a[4]
except IndexError:
b = 'sss'
よりクリーンな方法(dictを使用している場合のみ機能します):
b = a.get(4,"sss") # exact same thing as above
あなたが好むかもしれない別の方法があります(再び、辞書のみ):
b = a.setdefault(4,"sss") # if a[4] exists, returns that, otherwise sets a[4] to "sss" and returns "sss"
私はすべて許可を求めています(つまり、try
…except
メソッドが好きではありません)。ただし、メソッドにカプセル化すると、コードはずっときれいになります。
def get_at(array, index, default):
if index < 0: index += len(array)
if index < 0: raise IndexError('list index out of range')
return array[index] if index < len(a) else default
b = get_at(a, 4, 'sss')
これはGoogleのトップヒットであるため、標準の「コレクション」パッケージには、この問題に対するより柔軟なソリューションを提供する「defaultdict」が含まれていることにも言及する価値があります。
あなたはきちんとしたことをすることができます、例えば:
twodee = collections.defaultdict(dict)
twodee["the horizontal"]["the vertical"] = "we control"
インデックス演算子のデフォルト値を取得する保守可能な方法を探しているなら、私は次のことが有用だとわかりました:
オペレーターモジュールからoperator.getitem
をオーバーライドしてオプションのデフォルトパラメーターを追加すると、下位互換性を維持しながら元のパラメーターと同じ動作になります。
def getitem(iterable, index, default=None):
import operator
try:
return operator.getitem(iterable, index)
except IndexError:
return default
Try/catchを使用していますか?
try:
b=a[4]
except IndexError:
b='sss'
コードの長さを文字単位で短くするための簡単なハックを探しているなら、これを試してみてください。
a=['123','2',4]
a.append('sss') #Default value
n=5 #Index you want to access
max_index=len(a)-1
b=a[min(max_index, n)]
print(b)
ただし、このトリックは、リストをさらに変更する必要がなくなった場合にのみ役立ちます