2009-03-25 21 views
5

文字列からスライスオブジェクトを作成したいと思います。現在のところ、邪魔にならない評価のついた陳腐な言葉のようです。pythonは文字列からスライスオブジェクトを作成します

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

ありがとうございました。

編集:元のプロンプトがクリアされていない場合、この場合の入力は「:-1」でした。ポイントは文字列を解析することでした。 Ignacio Vazquez-Abramsの回答は少なくとも問題を解決しましたが、逆索引付けでもうまくいくようですが、私の解決策は概念的には清潔でないとまだはっきりしていると思います(Pythonで構文を変更すると正しく動作します)。

+0

あなたがすることができますあなたが探している行動をより明確にしてくれるでしょうか? –

+0

-1:スタンドアロンのスライスオブジェクトを作る理由は何ですか?スライスは一流の構文です。なぜあなたがこれをするのかについて何の背景もなしに、その質問は非常に奇妙です。 –

+0

Jaffe:更新された質問。 Lott:私は少しの言語作業をしており、Pythonスライスも使用したいと考えています。実際のオブジェクトは非常に便利です:配列の長さを指定して(始点、終点、増分)を与えるインデックス(len)関数を持っています – gatoatigrado

答えて

3
slice(*[{True: lambda n: None, False: int}[x == ''](x) for x in (mystring.split(':') + ['', '', ''])[:3]]) 
+7

これはちょっと間違っています、e。 g。 '1:1:1:1'は正しいスライス文字列ではなく、 '1:1:1'です。 これ以上のものが必要です:x.strip()else、mystring.split( ':'))) – pprzemek

+3

これは本当に醜いコードです。 – Evpok

+1

pprzemek、あなたのコメントは私の意見では最高の答えが含まれています、なぜあなたはそれから本当の答えをしないでください? –

4

スライスオブジェクトが必要な場合は、インスタンス化するだけです。

s = slice(start, stop, step) 

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

0

通常、スライスオブジェクトは添え字表記を使用して作成されます。この表記は、slice() documentationに記載されているように、slice()を内部的に使用します。やりたいことです:the python tutorialから

your_string[start:end] 

文字列は(インデックス付け)添字することができます。 文字列の最初の文字には添え字(インデックス)0が付いています。 文字は単にサイズ の文字列です。 Iconの場合と同様に、部分文字列は というスライス表記で指定できます.2つの のインデックスはコロンで区切ります。

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

スライスインデックスは有用なデフォルト値を持っています。 は省略され、最初のインデックスはデフォルトで0に設定されます。 省略された2番目のインデックスは、デフォルトで にスライスされる文字列のサイズになります。

>>> word[:2] # The first two characters 
'He' 
>>> word[2:] # Everything except the first two characters 
'lpA' 
+0

申し訳ありませんが、それは私が求めていたものではなく、私はスライスを解析したいと思います。文字列から "-3 :: 2"を取り出し、スライスオブジェクトを返す[元の質問を見る] – gatoatigrado

+0

あなたの質問から、それがあなたが求めていたことは明らかではありません。私はあなたをもう助けることができません、私はあなたがPythonを読んで、あなたがしようとしていることがそれに反していないか再考することをお勧めします、それはおそらく悪い考えです。 – mpeterson

+0

確かに、私のコードの大部分はそれを満たすと思います(参考に感謝)。申し訳ありませんもっと明確にする方法がわかりません。改訂された質問(および下記のコメント)を読んだことがありますか? について、 Nicholas – gatoatigrado

1

私はPythonのようなスプライス引数を受け入れ、整数のリストにそれをレンダリングするために私のスクリプトを望んでいたので、私はそれが答えのように思える機能でそれをやったここで終わります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] 
0

@pprzemaに基づいて、 kは精巧な解析のために、以下の機能を起草:

def parse_slice(v: Text): 
    """ 
    Parses text like python "slice" expression (ie ``-10::2``). 

    :param v: 
     the slice expression or a lone integer 
    :return: 
     - None if input is None/empty 
     - a ``slice()`` instance (even if input a lone numbrt) 
    :raise ValueError: 
     input non-empty but invalid syntax 
    """ 
    orig_v = v 
    v = v and v.strip() 
    if not v: 
     return 

    try: 
     if ':' not in v: 
      ## A lone number given. 
      v = int(v) 
      return slice(v, v + 1) 

     return slice(*map(lambda x: int(x.strip()) if x.strip() else None, 
          v.split(':'))) 
    except Exception: 
     pass 

    ## An alternative is to return `slice(None)` here. 
    raise trt.TraitError("Syntax-error in '%s' slice!" % orig_v) 
0

ここでもう一つの方法は、(他の人のちょうど統合はここに掲載)です:

def make_slice(expr): 
    def to_piece(s): 
     return s and int(s) or None 
    pieces = map(to_piece, expr.split(':')) 
    if len(pieces) == 1: 
     return slice(pieces[0], pieces[0] + 1) 
    else: 
     return slice(*pieces) 

例な用途:

In [1]: make_slice(':') 
Out[1]: slice(None, None, None) 

In [2]: make_slice(':-2') 
Out[2]: slice(None, -2, None) 

In [3]: x = [1, 2, 3] 

In [4]: x[make_slice('::-1')] 
Out[4]: [3, 2, 1] 
関連する問題