Apa cara terbaik untuk membagi daftar menjadi bagian yang kira - kira sama? Misalnya, jika daftar memiliki 7 elemen dan membaginya menjadi 2 bagian, kami ingin mendapatkan 3 elemen di satu bagian, dan yang lainnya harus memiliki 4 elemen.
Saya mencari sesuatu seperti even_split(L, n)
itu pecah L
menjadi n
beberapa bagian.
def chunks(L, n):
""" Yield successive n-sized chunks from L.
"""
for i in range(0, len(L), n):
yield L[i:i+n]
Kode di atas memberikan potongan 3, bukan 3 potongan. Saya hanya bisa memindahkan (iterate atas ini dan mengambil elemen pertama dari setiap kolom, memanggil bagian satu, lalu mengambil yang kedua dan meletakkannya di bagian dua, dll), tetapi itu menghancurkan pemesanan item.
>>> chunkIt(range(8), 6)
=>[[0], [1], [2, 3], [4], [5], [6], [7]]
chunkIt(range(10), 9)
harus mengembalikan 9 bagian, tetapi tidak.Anda dapat menulisnya cukup sederhana sebagai generator daftar:
Contoh:
sumber
n = min(n, len(a)) # don't create empty buckets
baris 1 untuk menghindari pembuatan ember kosong dalam skenario seperti dilist(split(range(X, Y)))
manaX < Y
Ini adalah raison d'être untuk
numpy.array_split
*:* dikreditkan ke Zero Piraeus di kamar 6
sumber
*
diprint
untuk?print(L)
dan `cetak (* L). Lihat juga stackoverflow.com/a/36908/2184122 atau cari "python use of asterisk".Selama Anda tidak ingin sesuatu yang konyol seperti bongkahan berkelanjutan:
sumber
zip(*chunkify(range(13), 3))
hasil di[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11)]
Mengubah kode untuk menghasilkan
n
potongan daripada potongann
:pemberian yang mana:
Ini akan menetapkan elemen tambahan ke grup akhir yang tidak sempurna tetapi sesuai dengan spesifikasi "kira-kira N bagian yang sama" :-) Maksud saya, 56 elemen akan lebih baik (19,19,18) sedangkan ini memberikan (18,18,20).
Anda bisa mendapatkan hasil yang lebih seimbang dengan kode berikut:
yang keluaran:
sumber
for x in chunks(mylist,num): print x
, saya mendapatkan potongan yang diinginkan, tetapi di antara mereka saya mendapatkan daftar kosong. Ada yang tahu kenapa? Yaitu, saya mendapatkan banyak[]
, satu demi satu potongan.Jika Anda membagi
n
elemen menjadik
potongan yang kasar, Anda dapat membuatn % k
potongan 1 elemen lebih besar dari potongan lainnya untuk mendistribusikan elemen ekstra.Kode berikut akan memberi Anda panjang untuk potongan:
Contoh:
n=11, k=3
menghasilkan[4, 4, 3]
Anda kemudian dapat dengan mudah menghitung mulai untuk potongan-potongan:
Contoh:
n=11, k=3
menghasilkan[0, 4, 8]
Menggunakan
i+1
potongan th sebagai batas kita mendapatkan bahwai
potongan daftarl
dengan lenn
adalahSebagai langkah terakhir, buat daftar dari semua bidak menggunakan pemahaman daftar:
Contoh:
n=11, k=3, l=range(n)
menghasilkan[range(0, 4), range(4, 8), range(8, 11)]
sumber
Ini akan melakukan pemisahan dengan satu ekspresi:
Daftar dalam contoh ini memiliki ukuran 18 dan dibagi menjadi 5 bagian. Ukuran bagian berbeda tidak lebih dari satu elemen.
sumber
Lihat
more_itertools.divide
:Instal via
> pip install more_itertools
.sumber
Ini adalah salah satu yang menambahkan
None
untuk membuat daftar panjangnya samasumber
Ini solusinya:
Menghasilkan
sumber
Berikut adalah generator yang dapat menangani sejumlah bilangan positif (bilangan bulat). Jika jumlah chunk lebih besar dari panjang daftar input, beberapa chunk akan kosong. Algoritma ini bergantian antara potongan pendek dan panjang daripada memisahkan mereka.
Saya juga menyertakan beberapa kode untuk menguji
ragged_chunks
fungsi.Kita dapat membuat ini sedikit lebih efisien dengan mengekspor perkalian ke dalam
range
panggilan, tetapi saya pikir versi sebelumnya lebih mudah dibaca (dan KERING).sumber
Lihatlah numpy.split :
sumber
Implementasi menggunakan metode numpy.linspace.
Cukup tentukan jumlah bagian yang Anda inginkan untuk dibagi array. Divisi akan berukuran hampir sama.
Contoh:
Memberi:
sumber
Solusi saya, mudah dimengerti
Dan satu kalimat terpendek pada halaman ini (ditulis oleh gadis saya)
sumber
Menggunakan pemahaman daftar:
sumber
Cara lain akan menjadi seperti ini, ide di sini adalah menggunakan kerapu, tapi singkirkan
None
. Dalam hal ini kita akan memiliki semua 'small_parts' terbentuk dari elemen di bagian pertama daftar, dan 'large_parts' dari bagian akhir daftar. Panjang 'bagian yang lebih besar' adalah len (small_parts) + 1. Kita perlu menganggap x sebagai dua sub-bagian yang berbeda.Cara saya mengaturnya mengembalikan daftar tuple:
sumber
Berikut varian lain yang menyebarkan elemen-elemen "tersisa" secara merata di antara semua chunks, satu per satu hingga tidak ada yang tersisa. Dalam implementasi ini, potongan yang lebih besar terjadi pada awal proses.
Misalnya, hasilkan 4 bongkahan dari daftar 14 elemen:
sumber
Sama dengan jawaban pekerjaan , tetapi memperhitungkan daftar akun dengan ukuran lebih kecil dari jumlah chuncks.
jika n (jumlah chunks) adalah 7 dan lst (daftar untuk membagi) adalah [1, 2, 3] chunks adalah [[0], [1], [2]] bukan [[0], [1] ], [2], [], [], [], []]
sumber
Anda juga bisa menggunakan:
sumber
Contoh:
l = [a for a in range(97)]
harus terdiri dari 10 bagian, masing-masing memiliki 9 elemen kecuali yang terakhir.Keluaran:
sumber
Katakanlah Anda ingin membagi daftar [1, 2, 3, 4, 5, 6, 7, 8] menjadi 3 daftar elemen
seperti [[1,2,3], [4, 5, 6], [7, 8]] , di mana jika elemen yang tersisa yang tersisa kurang dari 3, mereka dikelompokkan bersama.
Output: [[1,2,3], [4, 5, 6], [7, 8]]
Di mana panjang satu bagian adalah 3. Ganti 3 dengan ukuran potongan Anda sendiri.
sumber
1>
2>
sumber
inilah versi saya (terinspirasi dari Max)
sumber
Membulatkan ruang ganti dan menggunakannya sebagai indeks adalah solusi yang lebih mudah daripada apa yang diusulkan amit12690.
sumber
Dipilih dari tautan ini , dan inilah yang membantu saya. Saya memiliki daftar yang telah ditentukan.
sumber
katakanlah Anda ingin dibagi menjadi 5 bagian:
sumber
Saya sendiri sudah menulis kode dalam hal ini:
divide_ports (1, 10, 9) akan kembali
sumber
kode ini berfungsi untuk saya (kompatibel dengan Python3):
contoh (untuk tipe bytearray , tetapi berfungsi juga untuk daftar s):
sumber
Yang ini menyediakan potongan panjang <= n,> = 0
def
sebagai contoh
sumber
Saya mencoba sebagian besar solusi, tetapi mereka tidak berfungsi untuk kasus saya, jadi saya membuat fungsi baru yang berfungsi untuk sebagian besar kasus dan untuk semua jenis array:
sumber