Bagaimana saya bisa mendapatkan produk Cartesian (setiap kemungkinan kombinasi nilai) dari sekelompok daftar?
Memasukkan:
somelists = [
[1, 2, 3],
['a', 'b'],
[4, 5]
]
Output yang diinginkan:
[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4), (2, 'a', 5) ...]
set(cartesian product)
set(inputlist)
semua daftar input Anda. Tidak pada hasilnya.Jawaban:
itertools.product
Tersedia dari Python 2.6.
Yang sama dengan,
sumber
product()
menghasilkannitems_in_a_list ** nlists
elemen dalam hasil (reduce(mul, map(len, somelists))
). Tidak ada alasan untuk percaya bahwa menghasilkan elemen tunggal tidakO(nlists)
(diamortisasi) yaitu, kompleksitas waktu adalah sama seperti untuk bersarangfor
-loop sederhana misalnya, untuk input dalam pertanyaan :,nlists=3
jumlah total elemen dalam hasil :,3*2*2
dan setiap elemen memilikinlists
item (3
dalam hal ini).*
sebelum somelists? Apa fungsinya?sumber
Untuk Python 2.5 dan yang lebih lama:
Berikut ini adalah versi rekursif
product()
(hanya ilustrasi):Contoh:
sumber
args
adalah iterator.dengan itertools.product :
sumber
*
sebelum somelists?Saya akan menggunakan daftar pemahaman:
sumber
Ini adalah generator rekursif, yang tidak menyimpan daftar sementara
Keluaran:
sumber
def f(): while True: yield 1
akan terus meningkatkan ukuran tumpukan saat kita melewatinya?Dalam Python 2.6 dan di atas Anda dapat menggunakan 'itertools.product`. Dalam versi Python yang lebih lama Anda dapat menggunakan kode yang setara (hampir-lihat dokumentasi) berikut dari dokumentasi , setidaknya sebagai titik awal:
Hasil dari keduanya adalah iterator, jadi jika Anda benar-benar membutuhkan daftar untuk diproses lebih lanjut, gunakan
list(result)
.sumber
Meskipun sudah ada banyak jawaban, saya ingin membagikan beberapa pemikiran saya:
Pendekatan berulang
Pendekatan Rekursif
Pendekatan Lambda
sumber
Pendekatan Rekursif:
Pendekatan berulang:
sumber
Modifikasi kecil untuk solusi generator rekursif di atas dalam rasa variadic:
Dan tentu saja pembungkus yang membuatnya berfungsi sama persis dengan solusi itu:
dengan satu trade-off : itu memeriksa apakah rekursi harus pecah pada setiap loop luar, dan satu keuntungan : tidak ada hasil pada panggilan kosong, misalnya
product(())
, yang saya kira akan secara semantik lebih benar (lihat dokumen).Mengenai pemahaman daftar: definisi matematika berlaku untuk sejumlah argumen arbitrer, sementara pemahaman daftar hanya bisa berurusan dengan jumlah yang diketahui dari mereka.
sumber
Hanya untuk menambahkan sedikit pada apa yang telah dikatakan: jika Anda menggunakan sympy, Anda dapat menggunakan simbol daripada string yang membuatnya berguna secara matematis.
Tentang sympy .
sumber
Saya percaya ini bekerja:
sumber
Pendekatan Stonehenge:
keluaran:
sumber