Saya miliki sekarang:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
Saya ingin memiliki:
[1, 2, 3]
+ + +
[4, 5, 6]
|| || ||
[5, 7, 9]
Cukup dua elemen tambahan daftar.
Saya pasti bisa mengulangi kedua daftar itu, tetapi saya tidak ingin melakukannya.
Apa cara paling Pythonic untuk melakukannya?
python
list
elementwise-operations
Sibbs Gambling
sumber
sumber
Jawaban:
Gunakan
map
denganoperator.add
:atau
zip
dengan pemahaman daftar:Perbandingan waktu:
sumber
map
hanya akan tumbuh lebih penting dari waktu ke waktu. Python 2 akan kehilangan dukungan resmi dalam waktu kurang dari 3 tahun.Yang lain memberi contoh bagaimana melakukan ini dengan python murni. Jika Anda ingin melakukan ini dengan array dengan 100.000 elemen, Anda harus menggunakan numpy:
Melakukan penambahan elemen-bijaksana sekarang sepele
seperti di Matlab.
Waktu untuk membandingkan dengan versi tercepat Ashwini:
Jadi ini adalah faktor 25 lebih cepat! Tetapi gunakan apa yang sesuai dengan situasi Anda. Untuk program sederhana, Anda mungkin tidak ingin menginstal numpy, jadi gunakan python standar (dan saya menemukan versi Henry yang paling Pythonic). Jika Anda serius dengan angka-angka yang serius,
numpy
lakukan pengangkatan berat. Untuk speed freaks: sepertinya solusi numpy lebih cepat dimulain = 8
.sumber
sumber
[sum(x) for x in zip(list1, list2)]
sama dengan jawaban Anda, bukan? :)Seperti yang dijelaskan oleh orang lain, solusi cepat dan efisien ruang menggunakan numpy (np) dengan kemampuan manipulasi vektor bawaan:
1. Dengan Numpy
2. Dengan built-in
2.1 Lambda
Perhatikan bahwa map () mendukung banyak argumen.
2.2 pemahaman zip dan daftar
sumber
Lebih mudah digunakan
numpy
dari pendapat saya:Hasil:
Untuk informasi parameter terperinci, periksa di sini: numpy.add
sumber
Mungkin "cara paling pythonic" harus mencakup penanganan case di mana list1 dan list2 tidak berukuran sama. Menerapkan beberapa metode ini akan memberi Anda jawaban dengan tenang. Pendekatan numpy akan memberi tahu Anda, kemungkinan besar dengan ValueError.
Contoh:
Hasil mana yang mungkin Anda inginkan jika ini ada dalam fungsi dalam masalah Anda?
sumber
zip_longest
dari itertools denganfillvalue
dari0
.Ini sederhana dengan
numpy.add()
Lihat dokumen di sini
Jika Anda ingin menerima daftar python:
sumber
Ini akan berfungsi untuk 2 daftar atau lebih; iterasi melalui daftar daftar, tetapi menggunakan penambahan numpy untuk berurusan dengan elemen dari setiap daftar
sumber
Mungkin ini pythonic dan sedikit bermanfaat jika Anda memiliki jumlah daftar yang tidak diketahui, dan tanpa mengimpor apa pun.
Selama daftar memiliki panjang yang sama, Anda dapat menggunakan fungsi di bawah ini.
Di sini * args menerima sejumlah variabel daftar argumen (tetapi hanya menjumlahkan jumlah elemen yang sama di masing-masing).
* Digunakan lagi dalam daftar yang dikembalikan untuk membongkar elemen-elemen dalam setiap daftar.
Keluaran:
Atau dengan 3 daftar
Keluaran:
sumber
Gunakan peta dengan fungsi lambda:
sumber
Saya belum menghitung waktunya tetapi saya menduga ini akan cukup cepat:
sumber
Jika Anda perlu menangani daftar ukuran yang berbeda, jangan khawatir! Modul itertools yang luar biasa telah Anda liput:
Dalam Python 2,
zip_longest
disebutizip_longest
.Lihat juga jawaban dan komentar relevan ini untuk pertanyaan lain .
sumber
sumber
[a + b for (a, b) in zip(list1, list2)]
Meskipun, pertanyaan yang sebenarnya tidak ingin beralih pada daftar untuk menghasilkan hasilnya, tetapi semua solusi yang telah diajukan melakukan hal yang tepat di bawah tenda!
Untuk menyegarkan: Anda tidak dapat menambahkan dua vektor tanpa melihat ke semua elemen vektor. Jadi, kompleksitas algoritmik dari sebagian besar solusi ini adalah Big-O (n). Di mana n adalah dimensi vektor.
Jadi, dari sudut pandang algoritmik, menggunakan for for untuk secara iteratif menghasilkan daftar yang dihasilkan juga logis dan pythonic. Namun, selain itu, metode ini tidak memiliki overhead untuk memanggil atau mengimpor pustaka tambahan.
Pengaturan waktu yang ditunjukkan / dibahas di sini bergantung pada sistem dan implementasi, dan tidak dapat diukur untuk mengukur efisiensi operasi. Bagaimanapun, kompleksitas O besar dari operasi penambahan vektor adalah linear, artinya O (n).
sumber
sumber