4

文字列(または、さらに言えば、、、または)を含む変数Sがあり、それをリストのスライス指定子として使用するとします。スライスに必要な引数はであるため、単純に行うことはできません。 "1:3""1""1:"":3" LL[S]"int:int"

今、私は現在、Sその2つの構成要素に解析し、intすべてのエッジケース(そのうちの4つ)を処理して正しいスライスアクセスを考え出す醜いコードを持っていますが、これは単純に醜くて非Pythonです。

S文字列をエレガントに取得してスライス指定子として使用するにはどうすればよいですか?

4

2 に答える 2

5

これは、リスト内包表記を使用することにより、多くのハッキングなしで実行できます。文字列をで分割し:、分割されたアイテムを引数としてslice()ビルトインに渡します。これにより、私が考えることができるすべての場合に機能する方法で、1行でスライスを非常にうまく作成することができます。

slice(*[int(i.strip()) if i else None for i in string_slice.split(":")])

ビルトインを使用するslice()ことで、あまりにも多くのエッジケースを自分で処理する必要がなくなります。

使用例:

>>> some_list = [1, 2, 3]
>>> string_slice = ":2"
>>> some_list[slice(*[int(i.strip()) if i else None for i in string_slice.split(":")])]
[1, 2]
>>> string_slice = "::-1"
>>> some_list[slice(*[int(i.strip()) if i else None for i in string_slice.split(":")])]
[3, 2, 1]
于 2012-11-10T18:04:05.303 に答える
1

これが別の解決策です

eval("L[%s]" % S) 

警告-Sが外部(信頼できない)ソースから来ている場合は安全ではありません。

于 2012-11-10T18:14:39.380 に答える