ホームページ  >  記事  >  バックエンド開発  >  Python のスライス操作を 1 つの記事で徹底的に理解する

Python のスライス操作を 1 つの記事で徹底的に理解する

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼転載
2019-07-31 15:59:238972ブラウズ

Python のスライス操作を 1 つの記事で徹底的に理解する

Python を使用してさまざまな実際的な問題を解決する過程で、オブジェクトから部分的な値を抽出する状況によく遭遇しますが、これを完了するために特にスライス操作が使用されます。操作性の強力な武器。理論的には、条件式が適切であれば、1 回または複数回のスライス操作で任意の目標値を取得できます。スライス操作の基本構文は比較的単純ですが、内部ロジックを十分に理解していないとエラーが発生しやすく、そのようなエラーは奥深くに隠されていて検出が難しい場合があります。この記事では、スライス操作のさまざまな状況を詳細な例を通してまとめています。間違いや不足がある場合は、修正してください。

1. Python のスライブル オブジェクトのインデックス付け方法

Python のスライブル オブジェクトのインデックス付け方法には、正のインデックスと負のインデックスが含まれます。

下の図に示すように、例として a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] を取り上げます。

Python のスライス操作を 1 つの記事で徹底的に理解する

2. Python スライス操作の一般的な方法

完全なスライス式には、3 つのパラメーター (start_index、end_index、step) を区切るために使用される 2 つの「:」が含まれています。 「:」は 1 つだけあり、デフォルトの 3 番目のパラメータ step=1 です。

スライス操作の基本式: object[start_index : end_index : step]

step: 正と負の両方の数値を使用できます。その絶対値は、データをカットするときの「ステップ サイズ」を決定します。正と負の符号は「切断方向」を決定します。正は「左から右」に値を取得することを意味し、負は「右から左に」値を取得することを意味します。 step を省略した場合、デフォルトは 1 です。つまり、値は左から右に 1 ずつ増分されます。 「切る方向はとても重要です!」 「切る方向はとても重要です!」 「切る方向はとても重要です!」 大事なことは3回言いましょう!

start_index: 開始インデックス(インデックス自体も含む)を示します。このパラメータを省略した場合は、オブジェクトの「終点」から開始することを意味します。 「終点」、ステップで決定 ステップは正負のパラメータで決定され、ステップが正の場合は「始点」から、負の場合は「終点」から開始されます。

end_index: 終了インデックス(インデックス自体を除く)を示します。このパラメータを省略した場合は、「終点」までデータを取得することを意味します。 「終点」、これもステップパラメータによって決まります。正負で決まり、ステップが正の場合は「終点」へ、負の場合は「始点」へ進みます。 。

3. Python スライス操作の詳細な例

次の例は、リスト a = [0, 1, 2, 3, 4, 5, 6] に基づいています。 , 7, 8 , 9] 例:

>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

1. 単一の値を切り取る

>>> a[0]
0
>>> a[-4]
6

2. 完全なオブジェクトを切り取る

>>> a[:] # 从左往右
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[::] # 从左往右
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[::-1] # 从右往左
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

3. start_index とend_index は両方とも正 ( ) インデックスです

>>> a[1:6] # step=1,从左往右取值,start_index=1到end_index=6同样表示从左往右取值。
[1, 2, 3, 4, 5]
>>>a[1:6:-1] # step=-1,决定了从右往左取值,而start_index=1到end_index=6决定了从左往右取值,两者矛盾。
>>> [] # 输出为空列表,说明没取到数据。
>>>a[6:1] # step=1,决定了从左往右取值,而start_index=6到end_index=1决定了从右往左取值,两者矛盾。
>>> [] # 同样输出为空列表。
>>>a[:6] # step=1,从左往右取值,从“起点”开始一直取到end_index=6。
>>> [0, 1, 2, 3, 4, 5]
>>>a[:6:-1] # step=-1,从右往左取值,从“终点”开始一直取到end_index=6。
>>> [9, 8, 7]
>>>a[6:] # step=1,从左往右取值,从start_index=6开始,一直取到“终点”。
>>> [6, 7, 8, 9]
>>>a[6::-1] # step=-1,从右往左取值,从start_index=6开始,一直取到“起点”。
>>> [6, 5, 4, 3, 2, 1, 0]

関連する推奨事項: 「Python ビデオ チュートリアル

4. start_index と end_index が両方とも負 (-) インデックスである場合

>>>a[-1:-6] # step=1,从左往右取值,而start_index=-1到end_index=-6决定了从右往左取值,两者矛盾。
>>> []
>>>a[-1:-6:-1] # step=-1,从右往左取值,start_index=-1到end_index=-6同样是从右往左取值。
>>> [9, 8, 7, 6, 5]
>>>a[-6:-1] # step=1,从左往右取值,而start_index=-6到end_index=-1同样是从左往右取值。
>>> [4, 5, 6, 7, 8]
>>>a[:-6] # step=1,从左往右取值,从“起点”开始一直取到end_index=-6。
>>> [0, 1, 2, 3]
>>>a[:-6:-1] # step=-1,从右往左取值,从“终点”开始一直取到end_index=-6。
>>> [9, 8, 7, 6, 5]
>>>a[-6:] # step=1,从左往右取值,从start_index=-6开始,一直取到“终点”。
>>> [4, 5, 6, 7, 8, 9]
>>>a[-6::-1] # step=-1,从右往左取值,从start_index=-6开始,一直取到“起点”。
>>> [4, 3, 2, 1, 0]

5. start_index と end_index が正 ( ) 負 (-) の混合インデックスの場合

>>>a[1:-6] # start_index=1在end_index=-6的左边,因此从左往右取值,而step=1同样决定了从左往右取值。
>>> [1, 2, 3]
>>>a[1:-6:-1] # start_index=1在end_index=-6的左边,因此从左往右取值,但step=-则决定了从右往左取值,两者矛盾。
>>> []
>>>a[-1:6] # start_index=-1在end_index=6的右边,因此从右往左取值,但step=1则决定了从左往右取值,两者矛盾。
>>> []
>>>a[-1:6:-1] # start_index=-1在end_index=6的右边,因此从右往左取值,而step=-1同样决定了从右往左取值。
>>> [9, 8, 7]

6. 連続スライス操作

>>>a[:8][2:5][-1:]
>>> [4]

は次と同等です:

a[:8]=[0, 1, 2, 3, 4, 5, 6, 7]
a[:8][2:5]= [2, 3, 4]
a[:8][2:5][-1:] = 4

理論的には、最後に返されたオブジェクトが空でないスライス可能オブジェクトである限り、無制限の連続スライス操作が可能です。

7. スライス操作の 3 つのパラメーターは、式

>>>a[2+1:3*2:7%3] # 即:a[2+1:3*2:7%3] = a[3:6:1]
>>> [3, 4, 5]
を使用して表現できます。

8. 他のオブジェクトのスライス操作

前のスライス操作命令では、リストをリストとして受け取ります。たとえば、タプルや文字列など、スライスできるデータ型は数多くあります。

>>> (0, 1, 2, 3, 4, 5)[:3] # 元组的切片操作
>>> (0, 1, 2)
>>>'ABCDEFG'[::2] # 字符串的切片操作
>>>'ACEG'
>>>for i in range(1,100)[2::3][-10:]: # 利用range函数生成1-99的整数,然后取3的倍数,再取最后十个。
       print(i, end=' ')
>>> 72 75 78 81 84 87 90 93 96 99

4. Python で一般的に使用されるスライス操作

リストを取得します: a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] は説明オブジェクトです。

>>>b = a[::2]
[0, 2, 4, 6, 8]
は偶数の位置にあります。

>>>b = a[1::2]
[1, 3, 5, 7, 9]

2. 奇数の位置にあります。

>>>b = a[:] # ★★★★★
>>>print(b) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>print(id(a)) # 41946376
>>>print(id(b)) # 41921864
>>>b = a.copy()
>>>print(b) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>print(id(a)) # 39783752
>>>print(id(b)) # 39759176
需要注意的是:[:]和.copy()都属于“浅拷贝”,只拷贝最外层元素,内层嵌套元素则通过引用,而不是独立分配内存。
>>>a = [1,2,['A','B']]
>>>print('a={}'.format(a))
a=[1, 2, ['A', 'B']] # 原始a
>>>b = a[:]
>>>b[0] = 9 # 修改b的最外层元素,将1变成9
>>>b[2][0] = 'D' # 修改b的内嵌层元素
>>>print('a={}'.format(a)) # b修改内部元素A为D后,a中的A也变成了D,说明共享内部嵌套元素,但外部元素1没变。
a=[1, 2, ['D', 'B']] 
>>>print('b={}'.format(b)) # 修改后的b
b=[9, 2, ['D', 'B']] 
>>>print('id(a)={}'.format(id(a)))
id(a)=38669128
>>>print('id(b)={}'.format(id(b)))
id(b)=38669192

3. オブジェクト全体をコピーします。

>>>a[3] = ['A','B']
[0, 1, 2, ['A', 'B'], 4, 5, 6, 7, 8, 9]

4.単一の要素を変更します

>>>a[3:3] = ['A','B','C']
[0, 1, 2, 'A', 'B', 'C', 3, 4, 5, 6, 7, 8, 9]
>>>a[0:0] = ['A','B']
['A', 'B', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

5.要素を挿入

>>>a[3:6] = ['A','B']
[0, 1, 2, 'A', 'B', 6, 7, 8, 9]

6.要素の一部を置換

rrreee

5.概要

(1) start_index、end_index、および step は、正と負の両方、または正と負の混合を使用できます。ただし、1 つの原則に従う必要があります。つまり、2 つの値の順序が同じでなければなりません。そうしないと、データを正しく取得できません。start_index の位置が end_index の左側にある場合、それは次のことを意味します。値は左から右に取得され、step は正の数でなければなりません (左から右という意味もあります)。start_index の位置が end_index の右側にある場合、値は右から左に取得されることを意味します。このとき、step は負の数でなければなりません (右から左という意味もあります)。特殊なケースとして、start_index または end_index を省略した場合、開始インデックスと終了インデックスは step の正または負の値によって決定され、値の方向に矛盾はありませんが、正と負で得られる結果は完全に異なります。 1 つは左に、もう 1 つは右にあるため、異なります。

(2) スライスを使用する場合、特にステップを省略した場合、ステップの正と負を考慮する必要があります。たとえば、a[-1:] は、「終了点」から「開始点」に向かって始まると誤解されやすいです。つまり、a[-1:]= [0, 1, 2, 3, 4, 5] , 6, 7 , 8, 9] ですが、実際には a[-1:]=a[-1]=9 です。その理由は、step=1 が値を左から右に取得することを意味し、開始インデックス start_index= であるためです。 -1自体がオブジェクトの最大値であり、右側には要素がなく、さらに右側にはデータがないため、要素はa[-1]の1つだけです。

以上がPython のスライス操作を 1 つの記事で徹底的に理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。