1. 程式人生 > >切片(Slice)在python中的運用(:)

切片(Slice)在python中的運用(:)



一、python原生list中的運用

通常一個切片操作要提供三個引數[start:stop:step]

start是切片的起始位置

stop是切片的結束位置(不包括)

step可以不提供,預設值是1,步長值不能為0,不然會報錯。

ValueError: slice step cannot be zero

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

step為正數時,以list[start]元素位置開始, step做為步長到list[stop_]元素位置(不包括)為止,從左向右擷取。startstop不論是正數還是負數索引還是混用都可以,但是要保證 list[stop]元素的【邏輯】位置,必須在

list[start]元素的【邏輯】位置右邊,否則取不出元素。

print(list[0:4])

[0, 1, 2, 3]

print(list[1:-1])

[1, 2, 3, 4, 5, 6, 7, 8]

print(list[-8:8])

[2, 3, 4, 5, 6, 7]

step 是負數時,以list[start]元素位置開始, step做為步長到list[stop]元素位置(不包括)為止,從右向左擷取,要保證 list[stop]元素的【邏輯】位置

必須在list[start]元素的【邏輯】位置左邊,否則取不出元素。

print(list[5:2:-1])

[5, 4, 3]

print(list[7
:-7:-1])

[7, 6, 5, 4]

startstop在符合虛擬的邏輯位置關係時,startstop的絕對值是可以大於length的。

print(list[-12:5:2])

[0, 2, 4]

startstop都是可以省略的,例如list[:],被省略的預設由其對應左右邊界起始元素開始擷取。

print(list[:])

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

常用的切片操作

  1. 在某個位置插入元素

list[3:3] = "a"
print(list)

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

list[5:5] = ["a","b"]
print(list)

[0, 1, 2, 3, 4, 'a', 'b', 5, 6, 7, 8, 9]

list[5:5] = {"a":11}#插入字典型別元素時,只插入key
print(list)

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

  1. 在開始或結束位置之前插入元素

list[0:0] = ["a","b","c"]
print(list)

['a', 'b', 'c', 0, 1, 2, 3, 4, 5, 6, 7, 8,9]

list[9:9] = "a"#index9時,插入時不是結束位置print(list)

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

list[10:10] = ["a","b","c"]#在結束位置插入字典型別元素時,index要大於length長度print(list)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b','c']

在列表結束位置新增元素,相當於 list.append()函式,推薦使用append函式。

另外:extend() 函式用於在列表末尾一次性追加另一個序列中的多個值(用新列表擴充套件原來的列表),向列表中追加序列(必須是可迭代的),可以是列表、元組、字典(加入key值)、集合。用法為:list.extend(seq)

  1. 替換多個元素

連續切片替換,替換的值的長度沒有限制。
list[1:4] = "a"
print(list)

[0, 'a', 4, 5, 6, 7, 8, 9]

list[1:4] = [11,22,33,44,55]
print(list)

[0, 11, 22, 33, 44, 55, 4, 5, 6, 7, 8, 9]

對切片賦值,相當於替代原list中的切片部分,賦值的list不必與切片長度一致,也可以將切片賦值給新的變數,用以取原list中的一部分。

不連續切片替換

list[3:8:2] = ["a","b","c"]
print(list)

[0, 1, 2, 'a', 4, 'b', 6, 'c', 8, 9]

list[3:8:2] = ["a","b"]
print(list)
ValueError: attempt to assign sequence of size 2 to extended slice of size 3
list[3:8:2] = ["a","b","c","d"]
print(list)
ValueError: attempt to assign sequence of size 4 to extended slice of size 3

不連續切片替換,替換的值的長度必須和切片一致,如果不一致,會報ValueError錯誤

  1. 刪除切片

del list[2:5]
print(list)

[0, 1, 5, 6, 7, 8, 9]

或者

list[2:5] = []
print(list)

[0, 1, 5, 6, 7, 8, 9]

list[2:5] = ""
print(list)

[0, 1, 5, 6, 7, 8, 9]

  1. 切片的深淺拷貝問題

    Python中列表切片是深拷貝,即被複制的物件作為一個新的個體獨立存在,任意改變其一不會對另一個物件造成影響。即切片後的列表,賦值給新的物件。

    對切片賦值,是在原物件的進行修改。

    切片賦值給新的物件,是深拷貝得到的與原變數無關,是兩個不同的物件

    直接賦值,如 a = list ,是淺拷貝。

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

a = list[1:5]

a [3] = 121
print(list)
print(a)

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

[1, 2, 3, 121]

二、numpy中的運用

對於一維陣列,numpyarray中切片的操作與python列表的切片操作是相同的。

於二維陣列,索引規則為array[行,列]

importnumpy as np

nd =np.random.randint(10,100,size=(5,4))

nd

array([[55,34, 77, 15],

[39, 61, 43, 37],

[50, 71, 92, 17],

[94, 71, 25, 47],

[54, 20, 77,29]])

  1. 取行資料

    nd[2,:]

    array([50, 71, 92, 17])

    nd[1:4,:]

array([[39,61, 43, 37],

[50, 71, 92, 17],

[94, 71, 25,47]])

  1. .取列資料

    nd[:,2]

    array([77, 43, 92, 25, 77])

    nd[:,0:2]

array([[55,34],

[39, 61],

[50, 71],

[94, 71],

[54, 20]])

  1. .取一個數據塊

nd[1:3,1:3]

array([[61,43],

[71, 92]])

  1. .按照步長取值

nd[::2,::2]

array([[55, 77],

[50, 92],

[54, 77]])

陣列切片後可以賦值,只能是常數或者與切片形同的陣列,常數遵循廣播機制。

nd[::2,::2] = [111,222,333,444,555,666]# 報錯

ValueError:could not broadcast input array from shape (6) into shape (3,2)

nd[::2,::2] = 1111

nd

array([[1111,34, 1111,15],

[39,61,222,37],

[1111,71, 1111,17],

[94,71,444,47],

[1111,20, 1111,29]])

陣列切片是淺拷貝,味著資料不會被複制,任何修改都會直接反映到源陣列上

不想修改源陣列,可以切片後,在加上 .copy(),就會生成新的陣列。

相關推薦

切片Slicepython運用(:)

一、在python原生list中的運用通常一個切片操作要提供三個引數[start:stop:step] start是切片的起始位置stop是切片的結束位置(不包括)step可以不提供,預設值是1,步長值不能為0,不然會報錯。ValueError: slice step c

對於Python切片slice的理解

def split(self, sep=None, maxsplit=-1): # real signature unknown; restored from __doc__ """ S.split(sep=None, maxsplit=-1) -> l

Python高階特性——切片Slice

摘錄廖雪峰網站 定義一個list: 1 L = ['haha','xixi','hehe','heihei','gaga']  取其前三個元素: >>> L[0],L[1],L

Python】高階特性之切片slice

    在瞭解什麼是切片之前,先考慮一個問題:給定一個字串或者陣列,在Python中如何取其中的一部分資料。比如說我們要取前五個數或者前五個字元。在C++或者Java中底層都封裝了很好的庫函式給我們直接呼叫,比如Java中有subString,那麼在Python中,我們首先

Python 切片slice

切片 #!/usr/bin/env python # slice 在Python的應用 #擷取某些部分 r = range(10) print (list(r[ :5])) # r[a:b]=

Go - 切片Slice

什麽 部分 pri 長度 code ron logs 內存 tro 定義 切片本身不是數組,它指向底層的數組或者數組的一部分。因此,可以使用Slice來處理變長數組的應用場景。 Silice 是一種引用類型。 1、定義一個空的Slice package main

python學習python的核心數據類型

核心 ble 學習 經驗 隨心所欲 創建 相關 字符串 cells 數據類型是編程語言中的很重要的一個組成部分,我所知道的有數據類型的好處有:在內存中存放的格式知道,規定了有哪幾種可用的操作。我的埋點:為什麽要有數據類型那麽python中的數據類型有哪幾種呢? 對象類型

Python的“四大才子”字符串、列表、字典、集合

不可 inf nbsp 創建 重新 指向 分享圖片 table 數據類型 前戲:在python中把數據序列分為可變(mutable)和不可變(immutable)兩種 不可變:string、int、float、tuple 特點

Go語言學習筆記十一: 切片slice

操作 容量 方括號 一個 組類型 學習 中學 slice 修改 Go語言學習筆記十一: 切片(slice) 切片這個概念我是從python語言中學到的,當時感覺這個東西真的比較好用。不像java語言寫起來就比較繁瑣。不過我覺得未來java語法也會支持的。 定義切片 切片可以

Python如何理解if __name__ == '__main__'

面向 知識 about main 想要 二進制 imp space 包導入 摘要 通俗的理解 __name__ == ‘__main__‘ :假如你叫李凱.py,在朋友眼中,你是李凱( __name__ == ‘李凱‘ );在你自己眼中,你是你自己( __name__ ==

Go語言基礎—— Go語言結構體、Go語言切片Slice、range遍歷、Go語言Map集合

Go語言結構體 Go 語言中陣列可以儲存同一型別的資料,但在結構體中我們可以為不同項定義不同的資料型別。 結構體是由一系列具有相同型別或不同型別的資料構成的資料集合。  結構體表示一項記錄,比如儲存圖書館的書籍記錄,每本書有以下屬性: Title :標題&nbs

Python的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]

      Python中對於陣列和列表進行切片操作是很頻繁的,當然對於切片的操作可供我們直接使用的函式也是很遍歷了,我們今天主要簡單總結一下常用集中索引化方式,希望對大家有所幫助吧。           對於列表的切片比較簡單,在我之前的部落格裡面有詳細的講解,需要的話可

python3 python列表常見的操作

 下面列出列表常用的方法操作列表以及小例子: 1.  Append      在列表末尾新增元素,需在列表末尾新增元素,需要注意幾個點:      A. append中新增的引數是作為一個整體 1 >>> name = list("scott

python 歷險記python 常用的 json 操作

目錄 引言 你一定聽說過 JSON 吧。JSON 是當前最常用的資料傳輸格式之一,純文字,容易使用,方便閱讀,最重要的是在多個場合都被大量被使用。 既然 JSON 這麼好,那就讓我們繼續探險,去掌握 python 中對 JSON 的常用操作吧, okay, let's go! 基礎知識 我認為要學一個知識點

Python筆記——Python的基本語句、變數和資料型別

目錄 一、python的基本語句 1.1 print語句 任務 1.2 python的註釋 二、資料型別 2.1、整數 2.2、浮點數 2.3、字串 2.4、布林值 2.5、空值 三、Python中的變數 四、Python中定義字串 任務

go語言學習-陣列切片slice通過陣列賦值或建立詳解

go語言中陣列切片(slice)建立一般有兩種種方式: 陣列切片的建立 直接建立: arr := make([]int,10) 基於資料建立 arr := arr2[frist:last] 該切片的元素為從下標為frist的元素開始,到小標

Go語言學習八:切片slice和範圍range

// Go 語言切片是對陣列的抽象。切片的單詞來源於可以對其他陣列和切片進行片段擷取 // Go 陣列的長度不可改變,在特定場景中這樣的集合就不太適用, // Go中提供了一種靈活,功能強悍的內建型別切片("動態陣列"), // 與陣列相比切片的長度是不固定的,可以追加

Python學習筆記14-Python的程序和執行緒

1.多程序 1.1建立程序 Unix/Linux/Mac作業系統都可以使用fork()函式來建立子程序,分別在父程序和子程序內返回,例如 程式碼: import os # 匯入os模組 print ('當前程序的ID是:%s' % os.g

go遍歷結構體struct欄位對應的值,切片slice,字典map

一、遍歷結構體欄位: eg1: package main import ( "fmt" "reflect" ) type person struct { name string age int } func main()

python接口自動化--python字典和json的區別詳解

() ima 單引號 遍歷 不能 提取 都是 也說 none 簡介   這篇文章的由來是由於上一篇發送post請求的接口時候,參數傳字典(dict)和json的緣故,因為python中,json和dict非常類似,都是key-value的形式,為啥還要這麽傳參,在群裏問了