誤解や高度な使用法のPythonのスライス

我々はすべて知っているように、我々は、単一の要素、あなたがそれを行う方法のインデックスの範囲を取得したい場合は、その要素のインデックス値(または下付き)シーケンス型(文字列、リスト、タプルなど、...)で見つけることができますか?

スライス(スライス)技術をスライスして、我々は非常に柔軟型配列を処理することができ、クリッピング技術インデックスの断片です。一般的に言って、役割が高度な使用法の使用と多少の誤差があること、しかし、スライスシーケンスオブジェクトを傍受することで、我々の注目に値します。そこで、この記事では主に、私はあなたが学び、稼ぐことができると思い、一緒にみんなでコンテンツを説明します。

その前の文ではなく、リストの独自の操作部が、最も代表のリストので、この記事では、唯一の議論のための一例を示しています。

1.スライスの使用に基づい

Pythonのリストは非常に重要な基礎とデータ構造ですが、私は総合的にそれを学ん(末尾のリンクテキストを参照してください)要約記事を書きました。このホワイトペーパーでは、詳細に基本的な使用スライスをまとめたもので、今おさらい:

スライスの形で書かれ:;、私はときに最初のリストをスライスを開始するインデックス値が省略されてもよいであり; iは:iがN + M] iがNを+は、スライスの終了位置が、リストを省略することができる場合に最後の、 mは0が許可されていない、デフォルト値は1であり、提供され、mは負であり、インバーテッドリストされなくてもよいです。注:これらの値は、リストの長さよりも大きい、それは範囲外に報告されることはありません。

スライスの基本的な意味は以下のとおりですi番目のビットインデックスシーケンスから、右後のnビット要素、スペーサーろ過プレスメートルまでかかります。

  li = [1, 4, 5, 6, 7, 9, 11, 14, 16]
  ​
  # 以下写法都可以表示整个列表,其中 X >= len(li)
  li[0:X] == li[0:] == li[:X] == li[:] == li[::] == li[-X:X] == li[-X:]
  ​
  li[1:5] == [4,5,6,7] # 从1起,取5-1位元素
  li[1:5:2] == [4,6] # 从1起,取5-1位元素,按2间隔过滤
  li[-1:] == [16] # 取倒数第一个元素
  li[-4:-2] == [9, 11] # 从倒数第四起,取-2-(-4)=2位元素
  li[:-2] == li[-len(li):-2] == [1,4,5,6,7,9,11] # 从头开始,取-2-(-len(li))=7位元素
  ​
  # 步长为负数时,列表先翻转,再截取
  li[::-1] == [16,14,11,9,7,6,5,4,1] # 翻转整个列表
  li[::-2] == [16,11,7,5,1] # 翻转整个列表,再按2间隔过滤
  li[:-5:-1] == [16,14,11,9] # 翻转整个列表,取-5-(-len(li))=4位元素
  li[:-5:-3] == [16,9] # 翻转整个列表,取-5-(-len(li))=4位元素,再按3间隔过滤
  ​
  # 切片的步长不可以为0
  li[::0]  # 报错(ValueError: slice step cannot be zero)

(でも多くのベテラン)初心者のための上記のいくつかの例では、それを理解することは容易ではないかもしれません。インデックスは、以下の工程に負である(2); [M I:I + n]は、デフォルト値は、式補体を想像することにより、存在する(1)にしっかりと心式:Iは、二つの経験を締結しました正、インデックスは相互位置によって計算され、インデックスが負であり、ステップの長さは、第1のフリップフロッのリスト負であり、その後、逆インデックスを計算します。

図2は、擬似独立オブジェクトスライスであります

スライス操作は、結果が新しいシーケンスから独立して返します。このリストは、例えば、リストまたはリストは、新しいメモリアドレスを占有し、スライスしました。

スライスの結果は、摂取した場合、それは独立したオブジェクトであり、したがって、それが割当のために使用することができ、それはまた他の送達値のシーンのために使用することができます。要素オブジェクトが存在する場合、新しいリストは、元のリストの対象となり長くなるように、しかし、唯一のスライス浅いコピー、それは、要素のリストの元のコピーへの参照です。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
  li = [1, 2, 3, 4]
  ls = li[::]
  ​
  li == ls # True
  id(li) == id(ls) # False
  li.append(li[2:4]) # [1, 2, 3, 4, [3, 4]]
  ls.extend(ls[2:4]) # [1, 2, 3, 4, 3, 4]
  ​
  # 下例等价于判断li长度是否大于8
  if(li[8:]):
      print("not empty")
  else:
      print("empty")
  ​
  # 切片列表受制于原列表
  lo = [1,[1,1],2,3]
  lp = lo[:2] # [1, [1, 1]]
  lo[1].append(1) # [1, [1, 1, 1], 2, 3]
  lp # [1, [1, 1, 1]]

目に見えるので、セクションは結果を除去し、それが独立したオブジェクトとして使用することができるだけでなく、オブジェクトが可変長要素から取り出したか否かに注意を払います。

図3に示すように、スライスはプレースホルダとして使用することができます

独立したオブジェクトが元の配列の「取り出し」であり、元の配列に放置する、プレースホルダとして使用されるいずれかのスライス。

リストは、プレースホルダとしてスライスを使用して、同様の効果がスプライスリストを達成することができます。特に注目すべきなのは反復可能でなければならないの割り当てをスライスすることです。

  li = [1, 2, 3, 4]
  ​
  # 在头部拼接
  li[:0] = [0] # [0, 1, 2, 3, 4]
  # 在末尾拼接
  li[len(li):] = [5,7] # [0, 1, 2, 3, 4, 5, 7]
  # 在中部拼接
  li[6:6] = [6] # [0, 1, 2, 3, 4, 5, 6, 7]
  ​
  # 给切片赋值的必须是可迭代对象
  li[-1:-1] = 6 # (报错,TypeError: can only assign an iterable)
  li[:0] = (9,) #  [9, 0, 1, 2, 3, 4, 5, 6, 7]
  li[:0] = range(3) #  [0, 1, 2, 9, 0, 1, 2, 3, 4, 5, 6, 7]

上記の例では、独立したオブジェクトとして取り出しスライスする場合は、それらは空のリストであることがわかります、すなわち、李[0] ==のLi [LEN(LI):] ==のLi [6:6] == []私は、この純粋なプレースホルダの割り当て「純粋なプレースホルダ」と呼ばれるプレースホルダ、およびオリジナルの要素を破壊しませんが、インデックス内の特定の位置にある唯一の新しい要素をスプライスします。あなたは純粋なプレースホルダを削除すると、それは、リスト内の要素には影響しません。

「ピュアプレースホルダは、」「非純粋なプレースホルダ」非空のリストのセクションでは、それを操作し、元のリストに影響を与えます、(割り当ておよび削除)に対応します。純粋なプレースホルダのリストステッチを達成することができる場合には、非純粋なプレースホルダの置換リストを達成することができます。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''  
  li = [1, 2, 3, 4]
  ​
  # 不同位置的替换
  li[:3] = [7,8,9] # [7, 8, 9, 4]
  li[3:] = [5,6,7] # [7, 8, 9, 5, 6, 7]
  li[2:4] = ['a','b'] # [7, 8, 'a', 'b', 6, 7]
  ​
  # 非等长替换
  li[2:4] = [1,2,3,4] # [7, 8, 1, 2, 3, 4, 6, 7]
  li[2:6] = ['a']  # [7, 8, 'a', 6, 7]
  ​
  # 删除元素
  del li[2:3] # [7, 8, 6, 7]

スライスプレースホルダは、交換または削除効果の連続スパンを達成するための措置をとることができます。この使用が唯一の代替限りサポートされていることに留意すべきです。

  li = [1, 2, 3, 4, 5, 6]
  ​
  li[::2] = ['a','b','c'] # ['a', 2, 'b', 4, 'c', 6]
  li[::2] = [0]*3 # [0, 2, 0, 4, 0, 6]
  li[::2] = ['w'] # 报错,attempt to assign sequence of size 1 to extended slice of size 3
  ​
  del li[::2] # [2, 4, 6]

4、より多くの思考

それをスライスPythonのような他のプログラミング言語はありますか?何が違いますの?

おすすめ

転載: blog.51cto.com/14246112/2446619