Saya perlu penjelasan yang baik (referensi adalah nilai tambah) pada notasi irisan Python.
Bagi saya, notasi ini perlu sedikit diambil.
Kelihatannya sangat kuat, tapi saya belum mengerti.
Ini benar-benar sangat sederhana:
a[start:stop] # items start through stop-1
a[start:] # items start through the rest of the array
a[:stop] # items from the beginning through stop-1
a[:] # a copy of the whole array
Ada juga step
nilainya, yang dapat digunakan dengan salah satu di atas:
a[start:stop:step] # start through not past stop, by step
Poin utama yang perlu diingat adalah bahwa :stop
nilai tersebut mewakili nilai pertama yang tidak ada dalam slice yang dipilih. Jadi, perbedaan antara stop
dan start
jumlah elemen yang dipilih (jikastep
1, default).
Fitur lainnya adalah angka itu start
atau stop
mungkin angka negatif , yang artinya dihitung dari akhir array bukan dari awal. Begitu:
a[-1] # last item in the array
a[-2:] # last two items in the array
a[:-2] # everything except the last two items
Demikian pula, step
mungkin angka negatif:
a[::-1] # all items in the array, reversed
a[1::-1] # the first two items, reversed
a[:-3:-1] # the last two items, reversed
a[-3::-1] # everything except the last two items, reversed
Python baik kepada programmer jika ada item lebih sedikit dari yang Anda minta. Misalnya, jika Anda meminta a[:-2]
dan a
hanya berisi satu elemen, Anda mendapatkan daftar kosong dan bukan kesalahan. Terkadang Anda lebih suka kesalahan, jadi Anda harus sadar bahwa ini mungkin terjadi.
slice()
objekOperator slicing []
sebenarnya digunakan dalam kode di atas dengan slice()
objek menggunakan :
notasi (yang hanya valid di dalam []
), yaitu:
a[start:stop:step]
setara dengan:
a[slice(start, stop, step)]
Objek slice juga berperilaku sedikit berbeda tergantung pada jumlah argumen, mirip dengan range()
, yaitu keduanya slice(stop)
dan slice(start, stop[, step])
didukung. Untuk melewati menentukan argumen yang diberikan, orang mungkin menggunakan None
, sehingga misalnya a[start:]
setara dengan a[slice(start, None)]
atau a[::-1]
setara dengan a[slice(None, None, -1)]
.
Sementara :
notasi berbasis-sangat membantu untuk mengiris sederhana, penggunaan eksplisit slice()
objek menyederhanakan generasi pemrograman pemotongan.
None
ruang kosong mana pun. Misalnya[None:None]
membuat salinan lengkap. Ini berguna ketika Anda perlu menentukan akhir rentang menggunakan variabel dan perlu memasukkan item terakhir.del
notasi irisan slt. Secara khusus,del arr[:]
tidak segera jelas ("arr [:] membuat salinan, begitu juga menghapus del salinan itu ???" dll.)The Python tutorial berbicara tentang hal itu (scroll ke bawah sedikit sampai Anda mendapatkan ke bagian tentang mengiris).
Diagram seni ASCII juga membantu untuk mengingat cara kerja irisan:
sumber
a[-4,-6,-1]
untuk menjadiyP
tetapity
. Yang selalu berhasil adalah berpikir dalam karakter atau slot dan menggunakan pengindeksan sebagai interval setengah terbuka - kanan-terbuka jika langkah positif, kiri-terbuka jika langkah negatif.x[:0]
halnya ketika mulai dari awal), jadi Anda harus array kasus kecil khusus. : /Menghitung kemungkinan yang diizinkan oleh tata bahasa:
Tentu saja, jika
(high-low)%stride != 0
, maka titik akhirnya akan sedikit lebih rendah darihigh-1
.Jika
stride
negatif, pemesanan berubah sedikit karena kami menghitung mundur:Pengiris yang diperluas (dengan koma dan elips) sebagian besar hanya digunakan oleh struktur data khusus (seperti NumPy); urutan dasar tidak mendukungnya.
sumber
repr
__getitem__
adalah; contoh Anda setara denganapple[slice(4, -4, -1)]
.Jawaban di atas tidak membahas penugasan slice. Untuk memahami penugasan slice, sebaiknya tambahkan konsep lain pada seni ASCII:
Satu heuristik adalah, untuk irisan dari nol ke n, pikirkan: "nol adalah awal, mulailah dari awal dan ambil n item dalam daftar".
Heuristik lain adalah, "untuk setiap irisan, ganti start dengan nol, terapkan heuristik sebelumnya untuk mendapatkan akhir daftar, lalu hitung angka pertama kembali untuk memotong item dari awal"
Aturan pertama penugasan slice adalah bahwa sejak slicing mengembalikan daftar, penugasan slice membutuhkan daftar (atau yang dapat diubah lainnya):
Aturan kedua penugasan slice, yang juga bisa Anda lihat di atas, adalah bahwa bagian apa pun dari daftar dikembalikan oleh pengindeksan slice, itu adalah bagian yang sama yang diubah oleh penugasan slice:
Aturan penugasan slice yang ketiga adalah, daftar yang ditugaskan (iterable) tidak harus memiliki panjang yang sama; irisan diindeks hanya diiris dan diganti secara massal oleh apa pun yang ditugaskan:
Bagian tersulit yang digunakan adalah penugasan irisan kosong. Dengan menggunakan heuristik 1 dan 2, Anda dapat dengan mudah mengindeks potongan kosong:
Dan setelah Anda melihat itu, penugasan slice ke slice kosong juga masuk akal:
Perhatikan bahwa, karena kita tidak mengubah angka kedua dari slice (4), item yang dimasukkan selalu menumpuk tepat di atas 'o', bahkan ketika kita sedang menetapkan slice kosong. Jadi posisi untuk tugas irisan kosong adalah perpanjangan logis dari posisi untuk tugas irisan irisan kosong.
Membackup sedikit, apa yang terjadi ketika Anda terus dengan prosesi kami menghitung awal irisan?
Dengan mengiris, setelah selesai, Anda selesai; itu tidak mulai mengiris ke belakang. Dalam Python Anda tidak mendapatkan langkah negatif kecuali jika Anda secara eksplisit meminta mereka dengan menggunakan angka negatif.
Ada beberapa konsekuensi aneh terhadap aturan "setelah selesai, selesai":
Bahkan, dibandingkan dengan pengindeksan, pengiris Python adalah kesalahan-bukti yang aneh:
Terkadang hal ini berguna, tetapi juga dapat menyebabkan perilaku yang agak aneh:
Tergantung pada aplikasi Anda, itu mungkin ... atau mungkin tidak ... menjadi apa yang Anda harapkan di sana!
Di bawah ini adalah teks dari jawaban asli saya. Ini bermanfaat bagi banyak orang, jadi saya tidak ingin menghapusnya.
Ini juga dapat memperjelas perbedaan antara pengirisan dan pengindeksan.
sumber
Singkatnya, titik dua (
:
) dalam notasi subscript (subscriptable[subscriptarg]
) make slice notasi - yang memiliki argumen opsional,start
,stop
,step
:Mengiris Python adalah cara komputasi yang cepat untuk secara metodis mengakses bagian data Anda. Menurut pendapat saya, untuk menjadi programmer Python tingkat menengah, ini adalah salah satu aspek dari bahasa yang perlu Anda ketahui.
Definisi Penting
Untuk memulainya, mari kita tentukan beberapa istilah:
Cara Pengindeksan Bekerja
Anda dapat membuat angka positif atau negatif ini. Arti bilangan positif itu langsung, tetapi untuk bilangan negatif, seperti halnya indeks dalam Python, Anda menghitung mundur dari ujung untuk memulai dan berhenti , dan untuk langkah ini , Anda cukup mengurangi indeks Anda. Contoh ini dari tutorial dokumentasi , tetapi saya telah sedikit memodifikasinya untuk menunjukkan item mana dalam urutan masing-masing referensi indeks:
Cara Mengiris Bekerja
Untuk menggunakan notasi irisan dengan urutan yang mendukungnya, Anda harus menyertakan setidaknya satu titik dua dalam tanda kurung siku yang mengikuti urutan (yang sebenarnya menerapkan
__getitem__
metode urutan, sesuai dengan model data Python .)Notasi slice berfungsi seperti ini:
Dan ingat bahwa ada default untuk start , stop , dan step , jadi untuk mengakses default, cukup tinggalkan argumen.
Notasi irisan untuk mendapatkan sembilan elemen terakhir dari daftar (atau urutan lainnya yang mendukungnya, seperti string) akan terlihat seperti ini:
Ketika saya melihat ini, saya membaca bagian dalam tanda kurung sebagai "kesembilan dari akhir, sampai akhir." (Sebenarnya, saya menyingkatnya secara mental sebagai "-9, pada")
Penjelasan:
Notasi lengkapnya adalah
dan untuk mengganti default (sebenarnya ketika
step
negatif,stop
default adalah-len(my_list) - 1
, jadiNone
untuk stop benar-benar berarti pergi ke mana pun langkah akhir membawanya ke):Tanda titik dua ,,
:
adalah yang memberi tahu Python bahwa Anda memberinya sepotong dan bukan indeks biasa. Itulah sebabnya cara idiomatis membuat salinan daftar yang dangkal di Python 2 adalahDan membersihkannya adalah dengan:
(Python 3 mendapat
list.copy
danlist.clear
metode.)Ketika
step
negatif, standar untukstart
danstop
berubahSecara default, ketika
step
argumen kosong (atauNone
), itu ditugaskan untuk+1
.Tetapi Anda bisa memasukkan bilangan bulat negatif, dan daftar (atau sebagian besar slicables standar lainnya) akan diiris dari ujung ke awal.
Dengan demikian irisan negatif akan mengubah default untuk
start
danstop
!Mengkonfirmasi ini di sumbernya
Saya ingin mendorong pengguna untuk membaca sumber serta dokumentasi. The kode sumber untuk sepotong objek dan logika ini ditemukan di sini . Pertama-tama kita menentukan apakah
step
negatif:Jika demikian, batas bawah
-1
berarti kita mengiris hingga dan termasuk awal, dan batas atas adalah panjang minus 1, artinya kita mulai dari akhir. (Perhatikan bahwa semantik ini-1
adalah berbeda dari-1
yang pengguna dapat lulus indeks Python menunjukkan item terakhir.)Kalau
step
tidak positif, dan batas bawah akan menjadi nol dan batas atas (yang kita naiki tetapi tidak termasuk) panjang daftar irisan.Kemudian, kita mungkin perlu menerapkan default untuk
start
danstop
- default maka untukstart
dihitung sebagai batas atas ketikastep
negatif:dan
stop
, batas bawah:Berikan iris Anda nama deskriptif!
Anda mungkin merasa berguna untuk memisahkan pembentukan irisan dari meneruskannya ke
list.__getitem__
metode ( itulah yang dilakukan kurung siku ). Sekalipun Anda bukan orang baru, itu membuat kode Anda lebih mudah dibaca sehingga orang lain yang mungkin harus membaca kode Anda dapat lebih mudah memahami apa yang Anda lakukan.Namun, Anda tidak bisa hanya menetapkan beberapa bilangan bulat yang dipisahkan oleh titik dua ke sebuah variabel. Anda perlu menggunakan objek slice:
Argumen kedua,,
None
diperlukan, sehingga argumen pertama ditafsirkan sebagaistart
argumen jika tidak maka akan menjadistop
argumen .Anda kemudian dapat meneruskan objek irisan ke urutan Anda:
Sangat menarik bahwa rentang juga mengambil irisan:
Pertimbangan Memori:
Karena irisan daftar Python membuat objek baru dalam memori, fungsi penting lainnya yang harus diperhatikan adalah
itertools.islice
. Biasanya Anda ingin mengulang lebih dari satu irisan, tidak hanya itu dibuat secara statis dalam memori.islice
sempurna untuk ini. Peringatan, itu tidak mendukung argumen negatif untukstart
,,stop
ataustep
, jadi jika itu masalah Anda mungkin perlu menghitung indeks atau membalikkan iterable terlebih dahulu.dan sekarang:
Fakta bahwa irisan daftar membuat salinan adalah fitur dari daftar itu sendiri. Jika Anda mengiris objek canggih seperti DataFrame Pandas, itu dapat mengembalikan tampilan pada aslinya, dan bukan salinan.
sumber
Dan beberapa hal yang tidak langsung jelas bagi saya ketika saya pertama kali melihat sintaksis slicing:
Cara mudah untuk membalik urutan!
Dan jika Anda ingin, untuk beberapa alasan, setiap item kedua dalam urutan terbalik:
sumber
Dalam Python 2.7
Mengiris dengan Python
Memahami penugasan indeks sangat penting.
Ketika Anda mengatakan [a: b: c], Anda mengatakan tergantung pada tanda c (maju atau mundur), mulai dari dan berakhir pada b (tidak termasuk elemen pada indeks ke-b). Gunakan aturan pengindeksan di atas dan ingat Anda hanya akan menemukan elemen dalam rentang ini:
Namun rentang ini berlanjut di kedua arah tanpa batas:
Sebagai contoh:
Jika pilihan a, b, dan c Anda memungkinkan tumpang tindih dengan rentang di atas saat Anda melintasi menggunakan aturan untuk a, b, c di atas Anda akan mendapatkan daftar dengan elemen (disentuh saat melintasi) atau Anda akan mendapatkan daftar kosong.
Satu hal terakhir: jika a dan b sama, maka Anda juga mendapatkan daftar kosong:
sumber
a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]; a[:-2:-2]
yang menghasilkan[9]
Temukan tabel hebat ini di http://wiki.python.org/moin/MovingToPythonFromOtherLanguages
sumber
Setelah menggunakannya sedikit saya menyadari bahwa deskripsi yang paling sederhana adalah persis sama dengan argumen dalam satu
for
lingkaran ...Semua dari mereka adalah opsional:
Kemudian pengindeksan negatif hanya perlu Anda menambahkan panjang string ke indeks negatif untuk memahaminya.
Ini tetap bekerja untuk saya ...
sumber
Saya merasa lebih mudah untuk mengingat cara kerjanya, dan kemudian saya bisa mengetahui kombinasi start / stop / step tertentu.
Ini penting untuk dipahami
range()
terlebih dahulu:Mulai dari
start
, selangkah demi selangkahstep
, jangan sampaistop
. Sangat sederhana.Yang perlu diingat tentang langkah negatif adalah bahwa
stop
selalu merupakan akhir yang dikecualikan, apakah itu lebih tinggi atau lebih rendah. Jika Anda ingin irisan yang sama dalam urutan yang berlawanan, itu jauh lebih bersih untuk melakukan pembalikan secara terpisah: misal'abcde'[1:-2][::-1]
mengiris satu char dari kiri, dua dari kanan, lalu membalikkan. (Lihat jugareversed()
.)Mengiris urutan adalah sama, kecuali itu pertama menormalkan indeks negatif, dan itu tidak pernah bisa keluar dari urutan:
TODO : Kode di bawah ini memiliki bug dengan "tidak pernah keluar dari urutan" ketika abs (langkah)> 1; Saya pikir saya menambalnya menjadi benar, tetapi sulit dimengerti.
Jangan khawatir tentang
is None
detailnya - ingat saja bahwa menghilangkanstart
dan / ataustop
selalu melakukan hal yang benar untuk memberi Anda seluruh urutan.Normalisasi indeks negatif pertama memungkinkan mulai dan / atau berhenti dihitung dari akhir secara independen:
'abcde'[1:-2] == 'abcde'[1:3] == 'bc'
meskipunrange(1,-2) == []
. Normalisasi kadang-kadang dianggap sebagai "modulo the length", tetapi perhatikan itu menambahkan panjang hanya sekali: misalnya'abcde'[-53:42]
hanya seluruh string.sumber
this_is_how_slicing_works
tidak sama dengan irisan python. EG[0, 1, 2][-5:3:3]
akan mendapatkan [0] dengan python, tetapilist(this_is_how_slicing_works([0, 1, 2], -5, 3, 3))
mendapatkan [1].range(4)[-200:200:3] == [0, 3]
tetapilist(this_is_how_slicing_works([0, 1, 2, 3], -200, 200, 3)) == [2]
. Sayaif 0 <= i < len(seq):
adalah upaya untuk mengimplementasikan "tidak pernah keluar dari urutan" secara sederhana tetapi salah untuk langkah> 1. Saya akan menulis ulang nanti hari ini (dengan tes).Saya menggunakan metode "indeks poin antar elemen" untuk memikirkannya sendiri, tetapi salah satu cara menggambarkannya yang terkadang membantu orang lain mendapatkannya adalah ini:
X adalah indeks dari elemen pertama yang Anda inginkan.
Y adalah indeks dari elemen pertama yang tidak Anda inginkan.
sumber
Saya harap ini akan membantu Anda untuk membuat model daftar dengan Python.
Referensi: http://wiki.python.org/moin/MovingToPythonFromOtherLanguages
sumber
Notasi pengiris Python:
start
danend
, nilai-nilai negatif ditafsirkan sebagai relatif terhadap akhir urutan.end
menunjukkan posisi setelah elemen terakhir dimasukkan.[+0:-0:1]
.start
danend
Notasi meluas ke matriks (numpy) dan array multidimensi. Misalnya, untuk mengiris seluruh kolom yang dapat Anda gunakan:
Irisan menyimpan referensi, bukan salinan, dari elemen array. Jika Anda ingin membuat salinan array secara terpisah, Anda dapat menggunakan
deepcopy()
.sumber
Anda juga dapat menggunakan tugas irisan untuk menghapus satu atau lebih elemen dari daftar:
sumber
Ini hanya untuk beberapa info tambahan ... Pertimbangkan daftar di bawah ini
Beberapa trik lain untuk membalik daftar:
sumber
Ini adalah bagaimana saya mengajarkan irisan kepada pemula:
Memahami perbedaan antara pengindeksan dan pengirisan:
Wiki Python memiliki gambar yang luar biasa ini yang dengan jelas membedakan pengindeksan dan pengirisan.
Ini adalah daftar dengan enam elemen di dalamnya. Untuk memahami cara mengiris dengan lebih baik, pertimbangkan daftar itu sebagai satu set enam kotak yang ditempatkan bersama. Setiap kotak memiliki alfabet di dalamnya.
Pengindeksan seperti berurusan dengan isi kotak. Anda dapat memeriksa isi kotak apa pun. Tetapi Anda tidak dapat memeriksa isi beberapa kotak sekaligus. Anda bahkan dapat mengganti isi kotak. Tetapi Anda tidak bisa menempatkan dua bola dalam satu kotak atau mengganti dua bola sekaligus.
Mengiris seperti berurusan dengan kotak sendiri. Anda dapat mengambil kotak pertama dan meletakkannya di meja lain. Untuk mengambil kotak, yang perlu Anda ketahui adalah posisi awal dan akhir kotak.
Anda bahkan dapat mengambil tiga kotak pertama atau dua kotak terakhir atau semua kotak antara 1 dan 4. Jadi, Anda dapat memilih satu set kotak jika Anda tahu awal dan akhir. Posisi ini disebut posisi start dan stop.
Yang menarik adalah Anda bisa mengganti beberapa kotak sekaligus. Anda juga dapat menempatkan beberapa kotak di mana pun Anda suka.
Mengiris dengan Langkah:
Sampai sekarang Anda telah memilih kotak secara terus menerus. Tetapi kadang-kadang Anda perlu mengambil dengan hati-hati. Misalnya, Anda dapat mengambil setiap kotak kedua. Anda bahkan dapat mengambil setiap kotak ketiga dari ujung. Nilai ini disebut ukuran langkah. Ini menunjukkan jarak antara pickup Anda yang berurutan. Ukuran langkah harus positif jika Anda memilih kotak dari awal hingga akhir dan sebaliknya.
Bagaimana Python Angka Keluar Parameter Hilang:
Saat mengiris, jika Anda mengabaikan parameter apa pun, Python mencoba mengetahuinya secara otomatis.
Jika Anda memeriksa kode sumber CPython , Anda akan menemukan fungsi yang disebut PySlice_GetIndicesEx () yang menggambarkan indeks ke slice untuk parameter yang diberikan. Berikut adalah kode yang ekuivalen secara logis dengan Python.
Fungsi ini mengambil objek Python dan parameter opsional untuk mengiris dan mengembalikan panjang mulai, berhenti, langkah, dan iris untuk irisan yang diminta.
Ini adalah kecerdasan yang ada di balik irisan. Karena Python memiliki fungsi bawaan yang disebut slice, Anda dapat melewati beberapa parameter dan memeriksa seberapa pintar menghitung parameter yang hilang.
Catatan: Posting ini awalnya ditulis di blog saya, The Intelligence Behind Python Slices .
sumber
Sebagai aturan umum, menulis kode dengan banyak nilai indeks yang dikodekan menyebabkan kekacauan pembacaan dan pemeliharaan. Misalnya, jika Anda kembali ke kode setahun kemudian, Anda akan melihatnya dan bertanya-tanya apa yang Anda pikirkan ketika Anda menulisnya. Solusi yang ditampilkan hanyalah cara yang lebih jelas menyatakan apa yang sebenarnya dilakukan kode Anda. Secara umum, built-in slice () membuat objek slice yang dapat digunakan di mana pun slice diperbolehkan. Sebagai contoh:
Jika Anda memiliki turunan slice s, Anda dapat memperoleh informasi lebih lanjut tentangnya dengan melihat masing-masing atribut s.start, s.stop, dan s.step. Sebagai contoh:
sumber
1. Notasi Iris
Untuk membuatnya sederhana, ingat irisan hanya memiliki satu bentuk:
dan inilah cara kerjanya:
s
: sebuah objek yang dapat diirisstart
: indeks pertama untuk memulai iterasiend
: indeks terakhir, CATATANend
indeks yang tidak akan dimasukkan dalam irisan yang dihasilkanstep
: pilih elemen setiapstep
indeksHal lain yang impor: semua
start
,end
,step
bisa dihilangkan! Dan jika mereka dihilangkan, nilai default mereka akan digunakan:0
,len(s)
,1
sesuai.Jadi kemungkinan variasi adalah:
CATATAN: Jika
start >= end
(hanya mempertimbangkan saatstep>0
), Python akan mengembalikan potongan kosong[]
.2. Perangkap
Bagian di atas menjelaskan fitur inti tentang cara kerja slice, dan itu akan berfungsi pada sebagian besar kesempatan. Namun, mungkin ada jebakan yang harus Anda perhatikan, dan bagian ini menjelaskannya.
Indeks negatif
Hal pertama yang membingungkan pelajar Python adalah bahwa indeks bisa negatif! Jangan panik: indeks negatif berarti menghitung mundur.
Sebagai contoh:
Langkah negatif
Membuat hal-hal lebih membingungkan adalah itu
step
bisa negatif juga!Langkah negatif berarti mengembalikan array ke belakang: dari ujung ke awal, dengan indeks akhir disertakan, dan indeks awal dikecualikan dari hasilnya.
CATATAN : ketika langkah negatif, nilai default untuk
start
adalahlen(s)
(sementaraend
tidak sama dengan0
, karenas[::-1]
berisis[0]
). Sebagai contoh:Kesalahan di luar jangkauan?
Terkejut: irisan tidak meningkatkan IndexError ketika indeks berada di luar jangkauan!
Jika indeks berada di luar jangkauan, Python akan mencoba yang terbaik untuk mengatur indeks ke
0
ataulen(s)
sesuai dengan situasi. Sebagai contoh:3. Contoh
Mari kita selesaikan jawaban ini dengan contoh, menjelaskan semua yang telah kita diskusikan:
sumber
Jawaban sebelumnya tidak membahas pemotongan multi-dimensi array yang dimungkinkan menggunakan paket NumPy yang terkenal :
Mengiris juga dapat diterapkan ke array multi-dimensi.
"
:2
" Sebelum koma beroperasi pada dimensi pertama dan "0:3:2
" setelah koma beroperasi pada dimensi kedua.sumber
list
tetapi hanya diarray
dalam NumpyAnda dapat menjalankan skrip ini dan bereksperimen dengannya, di bawah ini adalah beberapa contoh yang saya dapatkan dari skrip.
Saat menggunakan langkah negatif, perhatikan bahwa jawabannya digeser ke kanan oleh 1.
sumber
Otak saya sepertinya senang menerima yang
lst[start:end]
berisistart
item -th. Saya bahkan dapat mengatakan bahwa itu adalah 'asumsi alami'.Tetapi kadang-kadang keraguan merayap masuk dan otak saya meminta jaminan bahwa itu tidak mengandung
end
unsur ke-5.Pada saat-saat ini saya mengandalkan teorema sederhana ini:
Properti cantik ini memberitahu saya bahwa
lst[start:end]
tidak mengandungend
item -th karena ada dilst[end:]
.Perhatikan bahwa teorema ini berlaku untuk
n
semua. Misalnya, Anda dapat memeriksanyakembali
True
.sumber
Menurut pendapat saya, Anda akan memahami dan menghafal notasi string Python yang lebih baik jika Anda melihatnya dengan cara berikut (baca terus).
Mari kita bekerja dengan string berikut ...
Bagi mereka yang tidak tahu, Anda dapat membuat substring dari
azString
menggunakan notasiazString[x:y]
Berasal dari bahasa pemrograman lain, saat itulah akal sehat dikompromikan. Apa itu x dan y?
Saya harus duduk dan menjalankan beberapa skenario dalam pencarian saya untuk teknik menghafal yang akan membantu saya mengingat apa x dan y dan membantu saya mengiris string dengan benar pada upaya pertama.
Kesimpulan saya adalah bahwa x dan y harus dilihat sebagai indeks batas yang mengelilingi string yang ingin kita ekstra. Jadi kita harus melihat ekspresi itu
azString[index1, index2]
atau bahkan lebih jelasazString[index_of_first_character, index_after_the_last_character]
.Berikut adalah contoh visualisasi dari ...
Jadi yang harus Anda lakukan adalah mengatur index1 dan index2 ke nilai-nilai yang akan mengelilingi substring yang diinginkan. Misalnya, untuk mendapatkan substring "cdefgh", Anda dapat menggunakan
azString[2:8]
, karena indeks di sisi kiri "c" adalah 2 dan yang pada ukuran kanan "h" adalah 8.Ingatlah bahwa kami sedang menetapkan batasan. Dan batas-batas itu adalah posisi di mana Anda dapat menempatkan beberapa tanda kurung yang akan dililitkan di sekitar bidang seperti ini ...
ab [ cdefgh ] ij
Trik itu bekerja sepanjang waktu dan mudah diingat.
sumber
Sebagian besar jawaban sebelumnya membersihkan pertanyaan tentang notasi slice.
Sintaks pengindeksan diperpanjang yang digunakan untuk mengiris adalah
aList[start:stop:step]
, dan contoh dasar adalah::
Contoh yang lebih mengiris: 15 Irisan Diperpanjang
sumber
Dalam Python, bentuk paling dasar untuk mengiris adalah sebagai berikut:
di mana
l
beberapa koleksi,start
merupakan indeks inklusif, danend
merupakan indeks eksklusif.Ketika mengiris dari awal, Anda bisa menghilangkan indeks nol, dan ketika mengiris hingga akhir, Anda bisa menghilangkan indeks akhir karena itu berlebihan, jadi jangan bertele-tele:
Bilangan bulat negatif berguna ketika melakukan offset relatif terhadap akhir koleksi:
Adalah mungkin untuk memberikan indeks yang di luar batas ketika mengiris seperti:
Ingatlah bahwa hasil mengiris koleksi adalah koleksi yang sama sekali baru. Selain itu, saat menggunakan notasi irisan dalam tugas, panjang tugas irisan tidak harus sama. Nilai sebelum dan sesudah irisan yang ditugaskan akan disimpan, dan koleksi akan menyusut atau tumbuh untuk mengandung nilai-nilai baru:
Jika Anda menghilangkan indeks awal dan akhir, Anda akan membuat salinan koleksi:
Jika indeks awal dan akhir dihilangkan saat melakukan operasi penugasan, seluruh konten koleksi akan diganti dengan salinan apa yang dirujuk:
Selain mengiris dasar, juga dimungkinkan untuk menerapkan notasi berikut:
di mana
l
koleksi,start
adalah indeks inklusif,end
adalah indeks eksklusif, danstep
merupakan langkah yang dapat digunakan untuk mengambil setiap item ke dalaml
.Menggunakan
step
menyediakan trik yang berguna untuk membalikkan koleksi dengan Python:Dimungkinkan juga untuk menggunakan bilangan bulat negatif
step
sebagai contoh berikut:Namun, menggunakan nilai negatif untuk
step
bisa menjadi sangat membingungkan. Selain itu, agar Pythonic , Anda harus menghindari menggunakanstart
,end
danstep
dalam satu irisan. Dalam hal ini diperlukan, pertimbangkan melakukan ini dalam dua tugas (satu untuk mengiris, dan yang lainnya untuk melangkah).sumber
Saya ingin menambahkan satu Hello, World! contoh yang menjelaskan dasar-dasar irisan untuk pemula. Itu banyak membantu saya.
Mari kita daftar dengan enam nilai
['P', 'Y', 'T', 'H', 'O', 'N']
:Sekarang irisan paling sederhana dari daftar itu adalah sublists-nya. Notasi adalah
[<index>:<index>]
dan kuncinya adalah membacanya seperti ini:Sekarang jika Anda membuat sepotong
[2:5]
daftar di atas, ini akan terjadi:Anda membuat potongan sebelum elemen dengan indeks
2
dan potongan lain sebelum elemen dengan indeks5
. Jadi hasilnya akan menjadi irisan antara dua potongan, daftar['T', 'H', 'O']
.sumber
Saya pribadi memikirkannya seperti
for
lingkaran:Juga, perhatikan bahwa nilai negatif untuk
start
danend
relatif terhadap akhir daftar dan dihitung dalam contoh di atas olehgiven_index + a.shape[0]
.sumber
Di bawah ini adalah contoh indeks string:
Contoh irisan: [mulai: akhir: langkah]
Di bawah ini adalah contoh penggunaannya:
sumber
Jika Anda merasa indeks negatif dalam mengiris membingungkan, berikut adalah cara yang sangat mudah untuk memikirkannya: cukup ganti dengan indeks negatif
len - index
. Jadi misalnya, ganti -3 denganlen(list) - 3
.Cara terbaik untuk menggambarkan apa yang dilakukan slicing secara internal adalah hanya menunjukkannya dalam kode yang mengimplementasikan operasi ini:
sumber
Teknik mengiris dasar adalah untuk menentukan titik awal, titik berhenti, dan ukuran langkah - juga dikenal sebagai langkah.
Pertama, kita akan membuat daftar nilai untuk digunakan dalam slicing kita.
Buat dua daftar untuk diiris. Yang pertama adalah daftar angka dari 1 hingga 9 (Daftar A). Yang kedua juga merupakan daftar angka, dari 0 hingga 9 (Daftar B):
Indeks angka 3 dari A dan angka 6 dari B.
Irisan dasar
Sintaks pengindeksan diperpanjang yang digunakan untuk mengiris adalah aList [start: stop: step]. Argumen mulai dan argumen langkah default ke tidak ada - satu-satunya argumen yang diperlukan adalah berhenti. Apakah Anda memperhatikan bahwa ini mirip dengan bagaimana rentang digunakan untuk menentukan daftar A dan B? Ini karena objek irisan mewakili set indeks yang ditentukan oleh rentang (mulai, berhenti, langkah). Dokumentasi Python 3.4.
Seperti yang Anda lihat, mendefinisikan hanya berhenti mengembalikan satu elemen. Sejak awal tidak ada, ini berarti hanya mengambil satu elemen saja.
Penting untuk dicatat, elemen pertama adalah indeks 0, bukan indeks 1. Inilah sebabnya kami menggunakan 2 daftar untuk latihan ini. Elemen Daftar A diberi nomor sesuai dengan posisi ordinal (elemen pertama adalah 1, elemen kedua adalah 2, dll.) Sedangkan elemen Daftar B adalah angka yang akan digunakan untuk mengindeksnya ([0] untuk elemen pertama 0, dll.)
Dengan sintaks pengindeksan yang diperluas, kami mengambil rentang nilai. Misalnya, semua nilai diambil dengan titik dua.
Untuk mengambil subset elemen, posisi awal dan berhenti harus ditentukan.
Dengan pola aList [start: stop], ambil dua elemen pertama dari Daftar A.
sumber
Saya tidak berpikir bahwa diagram tutorial Python (dikutip dalam berbagai jawaban lain) baik karena saran ini berfungsi untuk langkah positif, tetapi tidak untuk langkah negatif.
Ini adalah diagram:
Dari diagram, saya berharap
a[-4,-6,-1]
untuk menjadiyP
tetapity
.Yang selalu berhasil adalah berpikir dalam karakter atau slot dan menggunakan pengindeksan sebagai interval setengah terbuka - kanan-terbuka jika langkah positif, kiri-terbuka jika langkah negatif.
Dengan cara ini, saya bisa menganggapnya
a[-4:-6:-1]
sebagaia(-6,-4]
terminologi interval.sumber