Pythonスライスの高度な使い方について

2209 ワード

Pythonのリスト(list)、メタグループ(tuple)、文字列(str)などのシーケンスタイプは、スライス操作をサポートします.
1最後の要素設計
スライス操作には区間範囲の最後の要素は含まれません.PythonはJava言語と同様に0を先頭に下付きます.このようなメリットは、
  • [:x]構文が見られると、スライス内にx個の要素が含まれていることがわかる.
  • [start:stop]構文が見られると、スライス内にstop-start個の要素が含まれていることがわかる.
  • は、my_list[:x](範囲0~x-1)とmy_list[x:](範囲x~len-1)のように、1つの下付きスケールでシーケンスを重ならない2つの部分に分割することができる.
  • l=[10, 20, 30, 40, 50, 60]
    logging.info('l[:2] -> %s',l[:2])
    logging.info('l[2:] -> %s',l[2:])
    logging.info('l[:3] -> %s',l[:3])
    logging.info('l[3:] -> %s',l[3:])
    logging.info('l[1:2] -> %s',l[1:2])
    

    実行結果:
    INFO - l[:2] -> [10, 20]
    INFO - l[2:] -> [30, 40, 50, 60]
    INFO - l[:3] -> [10, 20, 30]
    INFO - l[3:] -> [40, 50, 60]
    INFO - l[1:2] -> [20]
    

    2スライス間隔s [ a : b : c ]の構文を用いて、s中のaとbの間の要素をc間隔でスライスすることもできる.c値が負の場合、逆取値が行われます.
    s='python'
    logging.info('s[::3] -> %s',s[::3])
    logging.info('s[::-1] -> %s',s[::-1])
    logging.info('s[::-2] -> %s',s[::-2])
    

    実行結果:
    INFO - s[::3] -> ph
    INFO - s[::-1] -> nohtyp
    INFO - s[::-2] -> nhy
    

    3操作スライス
    スライスを付与文の左側に置くと、シーケンスを直接変更できます.これをdel操作の対象とすれば,シーケンスを切除操作することができる.
    Luciano Ramalhoはこのような例を挙げています.
    l=list(range(10))
    logging.info('l -> %s',l)
    l[2:5]=[20,30]
    logging.info('l -> %s',l)
    del l[5:7]
    logging.info('l -> %s',l)
    l[3::2]=[11,22]
    logging.info('l -> %s',l)
    l[2:5]=[100]
    logging.info('l -> %s',l)
    l[2:5]=100
    

    実行結果:
    INFO - l -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    INFO - l -> [0, 1, 20, 30, 5, 6, 7, 8, 9]
    INFO - l -> [0, 1, 20, 30, 5, 8, 9]
    INFO - l -> [0, 1, 20, 11, 5, 22, 9]
    INFO - l -> [0, 1, 100, 22, 9]
    Traceback (most recent call last):
    ...
        l[2:5]=100
    TypeError: can only assign an iterable
    

    割り当てられたオブジェクトがスライスである場合は、反復可能なオブジェクトでなければなりません.値が1つでも反復可能なシーケンスに変換する必要があります.例えば、例の最後の例が直接100をl[2:5]に割り当てると、PythonはTypeError:can only assign an iterableエラーを投げ出す.