Tujuan saya adalah untuk memotong array menjadi blok, dan mengulang blok-blok itu dalam for-loop. Saat mengulang, saya juga ingin mencetak persentase data yang telah saya ulangi sejauh ini (karena dalam praktiknya saya akan membuat permintaan pada setiap loop, yang akan menyebabkan loop memakan waktu lama...)

Berikut kodenya:

# Function to chunk the data
def chunker(seq, size):
    return (seq[pos:pos + size] for pos in range(0, len(seq), size))

# Init data and chunks
d = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
chunked = chunker(d, 2)

i = 1
for chunk in chunked:
    print(i)
    print(str((i / len(list(chunked)) * 100)) + '%')
    i += 1
    print('end')

Jika Anda menjalankan kode ini, loop hanya akan berjalan sekali.

Namun, jika Anda mengomentari/menghapus pernyataan print(str((i / len(list(chunked)) * 100)) + '%') di dalam loop, maka itu akan berjalan 5 kali, yang merupakan perilaku yang diharapkan.

Mengapa pernyataan print saya menyebabkan loop saya keluar?

0
Alec Donald Mather 9 Januari 2021, 01:04

3 jawaban

Jawaban Terbaik

chunked adalah generator, bukan daftar, jadi Anda hanya dapat mengulanginya sekali. Saat Anda memanggil list(chunked), itu menghabiskan sisa generator, jadi tidak ada yang tersisa untuk loop for untuk diulang.

Juga, len(list(chunked)) akan menjadi 1 kurang dari yang Anda harapkan, karena tidak menyertakan elemen iterasi saat ini dalam daftar.

Ubah chunker untuk menggunakan pemahaman daftar alih-alih mengembalikan generator.

def chunker(seq, size):
    return [seq[pos:pos + size] for pos in range(0, len(seq), size)]
4
Barmar 8 Januari 2021, 22:08

Anda memanggil list(chunked) dalam panggilan Anda ke print() dan itu menghabiskan generator chunked. for chunk in chunked tidak mendapatkan item berikutnya, jadi keluar.

1
Grismar 8 Januari 2021, 22:08

Saya juga tampaknya tertarik untuk menampilkan bilah kemajuan. Jika Anda mengonversi generator ke daftar sebelum Anda mengulanginya, Anda dapat menggunakan pustaka yang disebut tqdm. Pastikan untuk tidak mencetak apa pun di dalam for loop untuk menyelamatkan terminal Anda dari brr.

Jalankan kode ini setelah $pip install tqdm

from tqdm import tqdm
import time

def chunker(seq, size):
    return list(seq[pos:pos + size] for pos in range(0, len(seq), size))

# Init data and chunks
d = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
chunked = chunker(d, 2)
print(chunked)
i = 1

for chunk in tqdm(chunked, desc='Iterating on chunked data'):
    time.sleep(.5)

Keluaran:

[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
Iterating on chunked data: 100%|██████████████████████████| 5/5 [00:02<00:00,  1.96it/s]
1
Deepak H R 8 Januari 2021, 22:21