10

文字列からスライス オブジェクトを作成したいと思います。今のところ、面倒なハッキーな eval ステートメントを使用する唯一の方法のようです

class getslice:
    def __getitem__(self, idx): return idx[0]
eval("getslice()[%s, 1]" %(":-1"))

前もって感謝します。

編集: 元のプロンプトが明確でない場合は申し訳ありませんが、この場合の入力は ":-1" でした。ポイントは、文字列を解析することでした。Ignacio Vazquez-Abrams の応答は、少なくとも問題を解決しました (逆インデックスでも機能するようです) が、上記の私の解決策は、概念的にクリーンではないにしても、より明確であると思います (Python がスライシング構文を変更した場合でも正しく機能します)。

4

11 に答える 11

4

スライス オブジェクトが必要な場合は、インスタンス化してみませんか?

s = slice(start, stop, step)

「文字列から作成する」とはどういう意味ですか?

于 2009-03-25T09:46:12.147 に答える
2
slice(*[{True: lambda n: None, False: int}[x == ''](x) for x in (mystring.split(':') + ['', '', ''])[:3]])
于 2009-03-25T14:51:40.167 に答える
2

スクリプトで python のような splice 引数を受け入れて整数のリストにレンダリングするようにしたかったため、ここで終了します。OP の質問に答えるような関数を使用して実行しました。

# create a slice object from a string
def get_slice_obj(slicearg):
    slice_ints = tuple([ int(n) for n in slicearg.split(':') ])
    return apply(slice, slice_ints)

def ints_from_slicearg(slicearg):
    slice_obj = get_slice_obj(slicearg)
    return(range(slice_obj.start or 0, slice_obj.stop or -1, slice_obj.step or 1))

for t in ['1', '1:3', '4:9:2']:
    print t, "=>", ints_from_slicearg(t)

出力:

1 => [0]
1:3 => [1, 2]
4:9:2 => [4, 6, 8]
于 2014-05-27T17:18:06.707 に答える
1

Ignacio Vazquez-Abrams のワンライナーは短いですが、ほとんど読みにくく、単一の数字を と矛盾して処理しsliceます。これにより、よりクリーンな方法で解析しようとします。

def parse_slice(value):
    """
    Parses a `slice()` from string, like `start:stop:step`.
    """
    if value:
        parts = value.split(':')
        if len(parts) == 1:
            # slice(stop)
            parts = [None, parts[0]]
        # else: slice(start, stop[, step])
    else:
        # slice()
        parts = []
    return slice(*[int(p) if p else None for p in parts])
# unit tests:
try:
    assert parse_slice('')
    assert False, 'It should raise TypeError'
except TypeError:
    pass
assert parse_slice('2') == slice(2)
assert parse_slice('2:3') == slice(2, 3)
assert parse_slice(':3') == slice(None, 3)
assert parse_slice(':') == slice(None, None)
assert parse_slice('2:') == slice(2, None)
assert parse_slice('2:3:4') == slice(2, 3, 4)
assert parse_slice(':3:4') == slice(None, 3, 4)
assert parse_slice('2::4') == slice(2, None, 4)
assert parse_slice('2:3:') == slice(2, 3, None)
assert parse_slice('::4') == slice(None, None, 4)
assert parse_slice('2::') == slice(2, None, None)
assert parse_slice('::') == slice(None, None, None)
assert parse_slice('-12:-13:-14') == slice(-12, -13, -14)
assert parse_slice('2:3:-4') == slice(2, 3, -4)
try:
    parse_slice('1:2:3:4')
    assert False, 'It should raise TypeError'
except TypeError:
    pass
于 2019-01-29T12:28:08.820 に答える
-1

スライス オブジェクトは通常、添字表記を使用して作成されます。この表記は、slice() のドキュメントに記載されているように、内部で slice() を使用します。あなたがしたいことは次のとおりです。

your_string[start:end]

Pythonチュートリアルから:

文字列には添字 (インデックス) を付けることができます。C と同様に、文字列の最初の文字の添字 (インデックス) は 0 です。個別の文字型はありません。文字は単にサイズ 1 の文字列です。Icon と同様に、部分文字列はスライス表記 (コロンで区切られた 2 つのインデックス) で指定できます。

>>> word = 'Help' + 'A' 
>>> word[4]
'A'
>>> word[0:2]
'He'
>>> word[2:4]
'lp'

スライス インデックスには便利なデフォルトがあります。省略された最初のインデックスはデフォルトでゼロになり、省略された 2 番目のインデックスはデフォルトでスライスされる文字列のサイズになります。

>>> word[:2]    # The first two characters
'He'
>>> word[2:]    # Everything except the first two characters
'lpA'
于 2009-03-25T14:42:28.753 に答える