Saya mencoba mempelajari cara "zip" daftar. Untuk tujuan ini, saya memiliki program, di mana pada titik tertentu, saya melakukan hal berikut:
x1, x2, x3 = stuff.calculations(withdataa)
Ini memberi saya tiga daftar, x1
, x2
, dan x3
, masing-masing, mengatakan, ukuran 20.
Sekarang saya lakukan:
zipall = zip(x1, x2, x3)
Namun, ketika saya melakukannya:
print "len of zipall %s" % len(zipall)
Saya mendapatkan 20, yang bukan itu yang saya harapkan. Saya mengharapkan tiga. Saya pikir saya melakukan sesuatu yang secara fundamental salah.
python
python-2.7
AJW
sumber
sumber
zip
untuk dilakukan? Mengapa Anda harus memiliki tiga daftar - seperti apa bentuknya?Jawaban:
Ketika Anda
zip()
bersama-sama tiga daftar yang masing-masing berisi 20 elemen, hasilnya memiliki dua puluh elemen. Setiap elemen adalah tiga tupel.Lihat diri mu sendiri:
Untuk mengetahui berapa banyak elemen yang berisi masing-masing tuple, Anda dapat memeriksa panjang elemen pertama:
Tentu saja, ini tidak akan berfungsi jika daftar kosong untuk memulai.
sumber
zip
mengembalikan daftar. Dalam Python 3 itu adalah iteratorzip
membutuhkan banyak daftar sukadan "ritsleting" mereka ke dalam satu daftar yang isinya 3-tupel
(ai, bi, ci)
. Bayangkan menggambar ritsleting secara horizontal dari kiri ke kanan.sumber
Dalam Python 2.7 ini mungkin berhasil:
Tetapi dalam Python 3.4 seharusnya (jika tidak, hasilnya akan menjadi seperti
<zip object at 0x00000256124E7DC8>
):sumber
zip
membuat daftar baru, diisi dengan tuple yang mengandung elemen dari argumen iterable:Saya berharap apa yang Anda coba adalah membuat tuple di mana setiap elemen adalah daftar.
sumber
Sumber: My Blog Post (pemformatan yang lebih baik)
Contoh
Memasukkan
Nol atau lebih iterables [1] (mis. Daftar, string, tuple, kamus)
Output (daftar)
i
tuple = (element_i arg1, element_i arg2 ..., element_i argn
)Kasus Tepi
1) String Kosong: len (str) = 0 = tidak ada tupel
2) Single String: len (str) == 2 tuple dengan len (args) == 1 elemen
Zip in Action!
1. Buat kamus [2] dari dua daftar
zip
adalah solusi yang elegan, jelas, & ringkas2. Cetak kolom dalam tabel
"*" [3] disebut "membongkar":
f(*[arg1,arg2,arg3]) == f(arg1, arg2, arg3)
Kredit Ekstra: Membuka Ritsleting
zip(*args)
disebut "unzipping" karena memiliki efek kebalikan darizip
unzipped
: tuple_1 = e1 dari setiap tuple yang di-zip. tuple_2 = e2 masing-masingzipped
Catatan kaki
*
Kode:*
mengambilnumbers
(1 arg) dan "membongkar" nya 'elemen 2 menjadi 2 argssumber
Pada dasarnya fungsi zip berfungsi pada daftar, tupel dan kamus dengan Python. Jika Anda menggunakan IPython maka cukup ketik zip? Dan periksa apa zip ().
Jika Anda tidak menggunakan IPython maka cukup instal: "pip install ipython"
Untuk daftar
Outputnya adalah
[('a', 'p'), ('b', 'q'), ('c', 'r')
Untuk kamus:
Outputnya adalah:
sumber
Dalam Python 3
zip
mengembalikan iterator dan perlu diteruskan ke fungsi daftar untuk mendapatkan zip tuple:Kemudian untuk
unzip
mereka kembali hanya konjugasi iterator zip:Jika bentuk asli daftar diperlukan, bukan tupel:
sumber
Demi kelengkapan itu.
Ketika panjang daftar zip tidak sama. Panjang daftar hasil akan menjadi yang terpendek tanpa terjadi kesalahan
sumber
Saya tidak berpikir
zip
mengembalikan daftar.zip
mengembalikan generator. Yang harus Anda lakukanlist(zip(a, b))
untuk mendapatkan daftar tupel.sumber
Layak untuk ditambahkan di sini karena ini adalah pertanyaan dengan peringkat sangat tinggi di zip.
zip
itu hebat, idiom Python - tetapi itu tidak skala sama sekali untuk daftar besar.Dari pada:
Gunakan
izip
. Untuk pemrosesan modern, ia menyimpannya dalam memori L1 Cache dan jauh lebih berkinerja untuk daftar yang lebih besar. Gunakan itu hanya dengan menambahkani
:sumber