web-dev-qa-db-ja.com

Pythonの範囲外のインデックスのデフォルト値を取得する

a=['123','2',4]
b=a[4] or 'sss'
print b

リストインデックスが範囲外の場合にデフォルト値を取得したい(ここで'sss')。

これどうやってするの?

69
zjm1126

Python「許可ではなく、許しを求める」という精神で、ここに1つの方法があります。

try:
    b = a[4]
except IndexError:
    b = 'sss'
86
Thomas

「許しではなく許可を求める」というPython以外の精神では、別の方法があります。

b = a[4] if len(a) > 4 else 'sss'
58
Thomas

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')
21
00500005

別の方法:

b = (a[4:]+['sss'])[0]
15
maep

独自のリストクラスを作成できます。

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'
13
gecco

これらの場合には、小さなヘルパー関数を定義することもできます:

def default(x, e, y):
    try:
        return x()
    except e:
        return y

タイプxの例外を発生させない限り、関数eの戻り値を返します。その場合、値yを返します。使用法:

b = default(lambda: a[4], IndexError, 'sss')

編集:指定されたタイプの例外のみをキャッチするようにしました。

改善の提案は大歓迎です!

5
Thomas

最初の要素が必要な一般的なケースでは、次のことができます

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)
5
Pepijn
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"
3
Vlad the Impala

私はすべて許可を求めています(つまり、tryexceptメソッドが好きではありません)。ただし、メソッドにカプセル化すると、コードはずっときれいになります。

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')
1
Konrad Rudolph

これはGoogleのトップヒットであるため、標準の「コレクション」パッケージには、この問題に対するより柔軟なソリューションを提供する「defaultdict」が含まれていることにも言及する価値があります。

あなたはきちんとしたことをすることができます、例えば:

twodee = collections.defaultdict(dict)
twodee["the horizontal"]["the vertical"] = "we control"

詳細: http://docs.python.org/2/library/collections.html

1
Jonathan Mayer

インデックス演算子のデフォルト値を取得する保守可能な方法を探しているなら、私は次のことが有用だとわかりました:

オペレーターモジュールからoperator.getitemをオーバーライドしてオプションのデフォルトパラメーターを追加すると、下位互換性を維持しながら元のパラメーターと同じ動作になります。

def getitem(iterable, index, default=None):
  import operator
  try:
    return operator.getitem(iterable, index)
  except IndexError:
    return default
1
Alex

Try/catchを使用していますか?

try:
    b=a[4]
except IndexError:
    b='sss'
0
zoli2k

コードの長さを文字単位で短くするための簡単なハックを探しているなら、これを試してみてください。

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)

ただし、このトリックは、リストをさらに変更する必要がなくなった場合にのみ役立ちます

0
Vikas Kumar