Saya mencari cara untuk dengan mudah membagi daftar python menjadi dua.
Sehingga jika saya memiliki sebuah array:
A = [0,1,2,3,4,5]
Saya bisa mendapatkan:
B = [0,1,2]
C = [3,4,5]
A = [1,2,3,4,5,6]
B = A[:len(A)//2]
C = A[len(A)//2:]
Jika Anda ingin fungsi:
def split_list(a_list):
half = len(a_list)//2
return a_list[:half], a_list[half:]
A = [1,2,3,4,5,6]
B, C = split_list(A)
B = A[:(len(A) // 10) * 8]
C = A[(len(A) // 10) * 8:]
Solusi yang sedikit lebih umum (Anda dapat menentukan jumlah bagian yang Anda inginkan, bukan hanya membagi 'dua'):
Sunting : posting yang diperbarui untuk menangani panjang daftar ganjil
EDIT2 : perbarui posting lagi berdasarkan komentar informatif Brians
sumber
//
berarti pembagian bilangan bulat. Mereka tidak boleh ditinggalkan karena mereka sangat penting dalam membuat pekerjaan ini.n
- panjang array hasil yang telah ditentukansumber
Uji:
hasil:
sumber
for i,j in zip(list,lengths): print(split(i,j))
. Daftarlist
danlengths
memiliki panjang yang sama. j berganti-ganti: 5,4,5,4,5, dan fungsi split bekerja pada dua alternatif pertama, yaitu ia membagi daftar pertamai
dengan 5 dan 4, TETAPI pada iterasi berikutnya ia membaginya menjadi 4,4, 1. : \ Tolong balas jika Anda ingin saya menjelaskan lebih lanjut (poskan pertanyaan baru)Jika Anda tidak peduli dengan pesanan ...
list[::2]
mendapatkan setiap elemen kedua dalam daftar mulai dari elemen 0.list[1::2]
dapatkan setiap elemen kedua dalam daftar mulai dari elemen 1.sumber
list
dengan membayangilist(...)
built-in. Saya sudah melihatlst
danlist_
digunakan secara umum untuk menghindarinya.B,C=A[:len(A)/2],A[len(A)/2:]
sumber
Berikut ini adalah solusi umum, pisahkan arr menjadi hitungan bagian
sumber
Saya diuji, dan slash ganda diperlukan untuk memaksa int divisi di python 3. Posting asli saya benar, meskipun wysiwyg pecah di Opera, untuk beberapa alasan.
sumber
Ada resi Python resmi untuk kasus yang lebih umum dari pemisahan array menjadi ukuran array yang lebih kecil
n
.Cuplikan kode ini berasal dari laman doc python itertools .
sumber
Menggunakan daftar slicing . Sintaks dasarnya
my_list[start_index:end_index]
Untuk mendapatkan bagian pertama dari daftar, Anda mengiris dari indeks pertama ke
len(i)//2
(di mana//
adalah divisi integer - jadi3//2 will give the floored result of
1, instead of the invalid list index of
1.5`):..dan tukar nilai di sekitar untuk mendapatkan paruh kedua:
sumber
3//2
memberikan hasil yang begitu banyak1
, kemudian Anda mendapatkani[:1]
yang memberi[0]
dan dani[1:]
yang memberi[1, 2]
Jika Anda memiliki daftar besar, Lebih baik menggunakan itertools dan menulis fungsi untuk menghasilkan setiap bagian sesuai kebutuhan:
Anda bisa menggunakan ini seperti:
Outputnya adalah:
Terima kasih kepada @thefourtheye dan @Bede Constantinides
sumber
10 tahun kemudian .. Saya pikir - mengapa tidak menambahkan yang lain:
sumber
Sementara jawaban di atas kurang lebih benar, Anda dapat mengalami masalah jika ukuran array Anda tidak dapat dibagi 2, karena
a / 2
, menjadi aneh, adalah float di python 3.0, dan dalam versi sebelumnya jika Anda tentukanfrom __future__ import division
di awal skrip Anda. Anda dalam hal apa pun lebih baik pergi untuk divisi integer, yaitua // 2
, untuk mendapatkan "maju" kompatibilitas kode Anda.sumber
Ini mirip dengan solusi lain, tetapi sedikit lebih cepat.
sumber
Dengan petunjuk dari @ChristopheD
sumber
sumber
Pandangan lain tentang masalah ini pada tahun 2020 ... Inilah generalisasi masalahnya. Saya menafsirkan 'membagi daftar menjadi setengah' menjadi .. (yaitu dua daftar saja dan tidak akan ada limpahan ke array ketiga dalam kasus yang aneh keluar dll). Misalnya, jika panjang array adalah 19 dan pembagian dengan dua menggunakan operator // memberikan 9, dan kita akan memiliki dua array dengan panjang 9 dan satu array (ketiga) dengan panjang 1 (jadi total tiga array). Jika kita menginginkan solusi umum untuk memberikan dua array sepanjang waktu, saya akan berasumsi bahwa kita senang dengan hasil array duo yang panjangnya tidak sama (satu akan lebih panjang dari yang lain). Dan itu dianggap ok untuk memiliki pesanan dicampur (berganti-ganti dalam kasus ini).
Konsep ini berfungsi untuk jumlah partisi daftar berapa pun yang Anda inginkan (Anda harus mengubah kode tergantung pada berapa banyak bagian daftar yang Anda inginkan). Dan agak mudah untuk ditafsirkan. Untuk mempercepat, Anda bahkan dapat menulis lingkaran ini dalam cython / C / C ++ untuk mempercepatnya. Kemudian lagi, saya sudah mencoba kode ini pada daftar yang relatif kecil ~ 10.000 baris dan selesai dalam sepersekian detik.
Hanya dua sen saya.
Terima kasih!
sumber