18

Pythonドキュメントからdocs.python.org/tutorial/introduction.html#strings

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

標準的なケースでは、これは非常に理にかなっています。

>>> s = 'mystring'
>>> s[1:]
'ystring'
>>> s[:3]
'mys'
>>> s[:-2]
'mystri'
>>> s[-1:]
'g'
>>> 

ここまでは順調ですね。ただし、負のステップ値を使用すると、わずかに異なるデフォルトが示唆されるようです。

>>> s[:3:-1]
'gnir'
>>> s[0:3:-1]
''
>>> s[2::-1]
'sym'

結構です。おそらくステップが負の場合、デフォルトは逆になります。省略された最初のインデックスはデフォルトでスライスされる文字列のサイズになり、省略された2番目のインデックスはデフォルトでゼロになります。

>>> s[len(s):3:-1]
'gnir'

よさそうだ!

>>> s[2:0:-1]
'sy'

おっと。その'm'を逃した。

次に、みんなのお気に入りの文字列逆ステートメントがあります。そしてそれは甘いです:

>>> s[::-1]
'gnirtsym'

でも:

>>> s[len(s):0:-1]
'gnirtsy'

スライスに、スライスの2番目のインデックスの値が含まれることはありません。私はそれをそのようにすることの一貫性を見ることができます。

そのため、さまざまな順列でのスライスの動作を理解し始めていると思います。ただし、2番目のインデックスはやや特殊であり、負のステップの2番目のインデックスのデフォルト値は実際には数値で定義できないように感じます。

提供された例を説明できるデフォルトのスライスインデックスを簡潔に定義できる人はいますか?ドキュメントは大きなプラスになります。

4

8 に答える 8

17

実際にはデフォルトはありません。省略された値は特別に扱われます。

ただし、いずれの場合も、省略された値は、Noneとまったく同じように扱われます。これは、インタプリタをハッキングしている(または、、などのモジュールを使用している)場合を除いてparserastデフォルトがNoneであると偽ることができ(再帰の答えが言うように)、常に正しい答えが得られることを意味します。

引用されている非公式のドキュメントは正確ではありません。これは、チュートリアルの一部であることが意図されているものには妥当です。実際の答えについては、リファレンスドキュメントを参照する必要があります。

2.7.3の場合、シーケンスタイプはノート3、4、および5のスライスについて説明しています。

の場合[i:j]

iが省略されている場合、またはNone、の場合は、を使用します0jが省略されている場合、または、の場合はNone、を使用しますlen(s)

そしてのために[i:j:k]

iまたはjが省略されているか、またはの場合、それらは「終了」値になります(終了はkNoneの符号に依存します)。kをゼロにすることはできないことに注意してください。kがの場合、はのように扱われます。None1

3.3の場合、シーケンスタイプの表現は2.7.3とまったく同じです。

于 2012-09-21T00:42:56.830 に答える
5

終了値は常に排他的であるため、0の終了値はインデックス1を含み、0を含まないことを意味します。代わりにNoneを使用します(負の数は異なる意味を持つため)。

>>> s[len(s)-1:None:-1]
'gnirtsym'

開始値にも注意してください。最後の文字インデックスはlen(s) - 1;にあります。-1(負の数は長さに対して解釈されるため)次のように綴るのもよいでしょう。

>>> s[-1:None:-1]
'gnirtsym'
于 2012-09-20T22:42:34.500 に答える
4

シーケンスタイプのリファレンスドキュメントの注記では、これについて詳細に説明しています。

(5.)ステップkでのiからjまでのsのスライスは、のようなインデックスを持つアイテムのシーケンスとして定義されます。つまり、インデックスは、、、などであり、jに達すると停止します(ただし、 jは含まれません)。iまたはjが、より大きい場合は、を使用します。iまたはjが省略されているか、またはの場合、それらは「終了」値になります(終了はkの符号に依存します)。kをゼロにすることはできないことに注意してください。kが_x = i + n*k0 <= n < (j-i)/kii+ki+2*ki+3*klen(s)len(s)NoneNone、のように扱われ1ます。

したがって、次の動作を得ることができます。

>>> s = "mystring"
>>> s[2:None:-1]
'sym'
于 2012-09-20T22:28:37.033 に答える
4

ドキュメントはありませんが、デフォルトは[None:None:None]

>>> "asdf"[None:None:None]
'asdf'
>>> "asdf"[None:None:-1]
'fdsa'
于 2012-09-20T22:31:23.133 に答える
1

実際には論理的です...

最終値を見ると、常に最後のインデックスの後のインデックスを指しています。したがって、0終了値として使用するということは、インデックス1の要素まで取得することを意味します。したがって、必要な文字列を返すように、その値を省略する必要があります。

>>> s = '0123456789'
>>> s[0], s[:0]
('0', '')
>>> s[1], s[:1]
('1', '0')
>>> s[2], s[:2]
('2', '01')
>>> s[3], s[:3]
('3', '012')
>>> s[0], s[:0:-1]
('0', '987654321')
于 2012-09-20T22:31:58.017 に答える
1

実装しているかどうかを知るのに役立ちます__getslice__デフォルトjsys.maxsizehttps://docs.python.org/2/reference/datamodel.html#object。getslice

>>> class x(str):
...   def __getslice__(self, i, j):
...     print i
...     print j
...
...   def __getitem__(self, key):
...     print repr(key)
...
>>> x()[:]
0
9223372036854775807
>>> x()[::]
slice(None, None, None)
>>> x()[::1]
slice(None, None, 1)
>>> x()[:1:]
slice(None, 1, None)
>>> import sys
>>> sys.maxsize
9223372036854775807L
于 2016-06-15T19:38:55.423 に答える
0

優れた回答があり、受け入れられた回答として最適なものが選択されますが、スライスのデフォルト値に頭を包む方法を探している場合は、リストが両端を持っていると想像するのに役立ちます。HEADで始まり、最初の要素、というように、最後の要素の後でTAILが終了するまで続きます。

今、実際の質問に答えます:

スライスには2つのデフォルトがあります

  1. ステップが+veの場合のデフォルト

    0:テール:+veステップ

  2. stepが-veの場合のデフォルト

    HEAD:-1:-veステップ

于 2021-01-30T17:51:01.583 に答える
0
于 2021-02-10T02:23:26.783 に答える