web-dev-qa-db-ja.com

変数を使用してリストをスライスするPython

リストが与えられた

a = range(10)

次のようなステートメントを使用してスライスできます

a[1]
a[2:4]

ただし、コードの他の場所で設定された変数に基づいてこれを実行したいと思います。私はこれを最初の人のために簡単に行うことができます

i = 1
a[i]

しかし、他の方法でこれを行うにはどうすればよいですか?私はリストを使ってインデックスを作成しようとしました:

i = [2, 3, 4]
a[i]

しかし、それはうまくいきません。文字列を使用してみました:

i = "2:4"
a[i]

しかし、それも機能しません。

これは可能ですか?

37
robintw

それが slice() の目的です。

a = range(10)
s = slice(2,4)
print a[s]

これはa[2:4]を使用するのと同じです。

79
mata

なぜ単一の変数でなければならないのですか? 2つの変数を使用するだけです。

i, j = 2, 4
a[i:j]

reallyが単一の変数である必要がある場合は、タプルを使用できます。

9
Mark Byers
>>> a=range(10)
>>> i=[2,3,4]

>>> a[i[0]:i[-1]]
range(2, 4)

>>> list(a[i[0]:i[-1]])
[2, 3]
2

以下の割り当てでは、表示するのと同じタイプのスライス操作を使用していますが、値の変数を使用しています。

a = range(10)
i = 2
j = 4

その後

print a[i:j]
[2, 3]
2
Levon

コマンドラインで渡された引数を使用して、ユーザーに_a:b:c_、_::c_などの通常のスライス構文を模倣する方法を調べているときに、これに遭遇しました。

引数は文字列として読み取られ、_':'_で分割するのではなく、slice()などに渡します。さらに、ユーザーがsingleinteger i、意図した意味は明らかに_a[i]_です。それにもかかわらず、slice(i)はデフォルトでslice(None,i,None)になり、これは望ましい結果ではありません。

いずれにせよ、私が思いつくことができる最も簡単な解決策は、文字列を変数stとして読み込んでから、目的のリストスライスをeval(f"a[{st}]")として復元することでした。

これは、組み込み eval() および f-string を使用します。ここで、stは中括弧内に挿入されます。コロンを含む文字列をそのまま接続するだけなので、通常のコロンで区切られたスライス構文を正確に処理します。

0
grobber