Bagaimana cara menggabungkan dua daftar dengan Python?
Contoh:
listone = [1, 2, 3]
listtwo = [4, 5, 6]
Hasil yang diharapkan:
>>> joinedlist
[1, 2, 3, 4, 5, 6]
Bagaimana cara menggabungkan dua daftar dengan Python?
Contoh:
listone = [1, 2, 3]
listtwo = [4, 5, 6]
Hasil yang diharapkan:
>>> joinedlist
[1, 2, 3, 4, 5, 6]
[1,2,5] and [2,4,5,6]
? Apakah Anda ingin duplikat disertakan, dikecualikan, atau tidak peduli?Jawaban:
Anda dapat menggunakan
+
operator untuk menggabungkan mereka:Keluaran:
sumber
listone += listtwo
menghasilkanlistone == [1, 2, 3, 4, 5, 6]
list3 = listone
listone+=listtwo
Apakah list3 diubah juga?Anda juga dapat membuat generator yang hanya mengulang item di kedua daftar menggunakan
itertools.chain()
. Ini memungkinkan Anda untuk membuat daftar rantai (atau iterable) bersama untuk diproses tanpa menyalin item ke daftar baru:sumber
chain
ada di sisi yang lebih lambat (tetapi tidak banyak) untuk dua daftar, tetapi merupakan solusi tercepat untuk merantai beberapa daftar (n >> 2).>= 3.5
Alternatif Python :[*l1, *l2]
Alternatif lain telah diperkenalkan melalui penerimaan
PEP 448
yang layak disebutkan.PEP, berjudul Generalisasi Unpacking Tambahan , umumnya mengurangi beberapa batasan sintaksis saat menggunakan
*
ekspresi berbintang dalam Python; dengan itu, bergabung dengan dua daftar (berlaku untuk semua iterable) sekarang juga dapat dilakukan dengan:Fungsi ini didefinisikan untuk Python
3.5
yang belum di-backport ke versi sebelumnya dalam3.x
keluarga. Dalam versi yang tidak didukung, aSyntaxError
akan dinaikkan.Seperti dengan pendekatan lain, ini juga menciptakan salinan elemen yang dangkal dalam daftar yang sesuai.
The upside untuk pendekatan ini adalah bahwa Anda benar-benar melakukan daftar tidak perlu untuk melakukan itu, apa pun yang iterable akan melakukan. Sebagaimana dinyatakan dalam PEP:
Jadi, sementara penambahan dengan
+
akan meningkatkanTypeError
karena ketidakcocokan jenis:Berikut ini tidak akan:
karena pertama-tama akan membongkar isi iterables dan kemudian hanya membuat
list
dari isinya.sumber
res = [*l1, *reversed(l2)]
. Karenareversed
mengembalikan iterator,res = l1 + reversed(l2)
akan menimbulkan kesalahan.Anda bisa menggunakan set untuk mendapatkan daftar nilai unik yang digabungkan
sumber
listone + [x for x in listtwo if x not in listone]
import collections; mergedlist = list(collections.OrderedDict.fromkeys(listone + listtwo))
akan melakukan trik.Anda juga bisa menggunakan
list.extend()
metode ini untuk menambahkan alist
ke akhir yang lain:Jika Anda ingin mempertahankan daftar asli, Anda dapat membuat
list
objek baru , danextend
keduanya daftar di dalamnya:sumber
Pada 3.7, ini adalah metode stdlib paling populer untuk menggabungkan dua (atau lebih) daftar dengan python.
Performa
Rangkuman 2-Daftar 1
Tidak ada banyak perbedaan antara metode ini tetapi itu masuk akal mengingat mereka semua memiliki urutan kompleksitas yang sama (linier). Tidak ada alasan khusus untuk lebih memilih satu daripada yang lain kecuali sebagai masalah gaya.
Rangkaian N-List
Plot telah dibuat menggunakan modul perfplot . Kode, untuk referensi Anda.
1.
iadd
(+=
) danextend
metode beroperasi di tempat, sehingga salinan harus dibuat setiap kali sebelum pengujian. Agar semuanya adil, semua metode memiliki langkah pra-salin untuk daftar sebelah kiri yang dapat diabaikan.Komentar untuk Solusi Lain
JANGAN GUNAKAN METODE DUNDER
list.__add__
secara langsung dengan cara, bentuk atau bentuk apa pun. Bahkan, jauhi metode-metode gelap, dan gunakan operator danoperator
fungsi seperti yang dirancang untuknya. Python memiliki semantik yang matang yang dimasukkan ke dalam ini yang lebih rumit daripada hanya memanggil dunder secara langsung. Berikut ini sebuah contoh . Jadi, untuk meringkas,a.__add__(b)
=> BAD;a + b
=> BAIK.Beberapa jawaban di sini menawarkan
reduce(operator.add, [a, b])
untuk pasangan berpasangan - ini sama dengansum([a, b], [])
hanya lebih bertele-tele.Metode apa pun yang menggunakan
set
akan menjatuhkan duplikat dan kehilangan pemesanan. Gunakan dengan hati-hati.for i in b: a.append(i)
lebih bertele-tele, dan lebih lambat daripadaa.extend(b)
, yang merupakan panggilan fungsi tunggal dan lebih idiomatis.append
lebih lambat karena semantik dengan mana memori dialokasikan dan dikembangkan untuk daftar. Lihat di sini untuk diskusi serupa.heapq.merge
akan berfungsi, tetapi kasus penggunaannya adalah untuk menggabungkan daftar yang diurutkan dalam waktu linier. Menggunakannya dalam situasi lain adalah anti-pola.yield
ing elemen daftar dari suatu fungsi adalah metode yang dapat diterima, tetapichain
apakah ini lebih cepat dan lebih baik (memiliki jalur kode dalam C, jadi itu cepat).operator.add(a, b)
adalah fungsional yang setara dengana + b
. Ini menggunakan kasus terutama untuk pengiriman metode dinamis. Kalau tidak, lebih sukaa + b
yang lebih pendek dan lebih mudah dibaca, menurut saya . YMMV.sumber
"There's not much difference between these methods but that makes sense given they all have the same order of complexity (linear). There's no particular reason to prefer one over the other except as a matter of style.
"Solusi yang tidak tercantum dalam jawaban saya, atau dikritik dalam" Komentar "Saya sarankan untuk tidak menggunakan.Ini cukup sederhana, dan saya pikir itu bahkan ditampilkan dalam tutorial :
sumber
Pertanyaan ini langsung bertanya tentang bergabung dengan dua daftar. Namun itu cukup tinggi dalam pencarian bahkan ketika Anda mencari cara untuk bergabung dengan banyak daftar (termasuk kasus ketika Anda bergabung dengan daftar nol).
Saya pikir pilihan terbaik adalah menggunakan daftar pemahaman:
Anda juga dapat membuat generator:
Jawaban Lama
Pertimbangkan pendekatan yang lebih umum ini:
Akan menghasilkan:
Catatan, ini juga bekerja dengan benar saat
a
ini[]
atau[[1,2,3]]
.Namun, ini dapat dilakukan dengan lebih efisien dengan
itertools
:Jika Anda tidak membutuhkan
list
, tetapi hanya iterable, hilangkanlist()
.Memperbarui
Alternatif yang disarankan oleh Patrick Collins dalam komentar juga dapat bekerja untuk Anda:
sumber
reduce
sekarangfunctools
jadi Anda harus mengimpornya terlebih dahulu.Anda cukup menggunakan operator
+
atau+=
sebagai berikut:Atau:
Juga, jika Anda ingin nilai dalam daftar yang digabungkan menjadi unik, Anda dapat melakukannya:
sumber
list(dict.fromkeys(a + b))
Perlu dicatat bahwa
itertools.chain
fungsi menerima jumlah variabel argumen:Jika input (tuple, daftar, generator, dll.) Adalah input,
from_iterable
metode kelas dapat digunakan:sumber
Dengan Python 3.3+ Anda dapat menggunakan hasil dari :
Atau, jika Anda ingin mendukung sejumlah iterator yang sewenang-wenang:
sumber
itertools.chain
(yang setara) alih-alih mendefinisikan fungsi Anda sendiri.Jika Anda ingin menggabungkan dua daftar dalam bentuk yang diurutkan, Anda dapat menggunakan
merge
fungsi dariheapq
perpustakaan.sumber
Jika Anda tidak dapat menggunakan operator plus (
+
), Anda dapat menggunakanoperator
impor:Atau, Anda juga bisa menggunakan fungsi
__add__
dunder :sumber
+
tidak aktif, gunakanoperator.add
.Sebagai cara yang lebih umum untuk daftar yang lebih banyak, Anda dapat menempatkannya di dalam daftar dan menggunakan fungsi
itertools.chain.from_iterable()
1 yang berdasarkan jawaban ini adalah cara terbaik untuk mengepakkan daftar bertingkat:1. Perhatikan bahwa
chain.from_iterable()
tersedia dalam Python 2.6 dan yang lebih baru. Di versi lain, gunakanchain(*l)
.sumber
Jika Anda perlu menggabungkan dua daftar berurutan dengan aturan penyortiran yang rumit, Anda mungkin harus menggulungnya sendiri seperti dalam kode berikut (menggunakan aturan penyortiran sederhana untuk keterbacaan :-)).
sumber
heapq.merge
.Anda bisa menggunakan
append()
metode yang didefinisikan padalist
objek:sumber
Kode di atas, tidak mempertahankan pesanan, menghapus duplikat dari setiap daftar (tetapi tidak dari daftar yang digabungkan)
sumber
Seperti yang telah ditunjukkan oleh banyak orang,
itertools.chain()
adalah cara untuk pergi jika seseorang perlu menerapkan perlakuan yang sama persis untuk kedua daftar. Dalam kasus saya, saya memiliki label dan bendera yang berbeda dari satu daftar ke yang lain, jadi saya perlu sesuatu yang sedikit lebih kompleks. Ternyata, di balik layaritertools.chain()
cukup lakukan hal berikut:(lihat https://docs.python.org/2/library/itertools.html ), jadi saya mengambil inspirasi dari sini dan menulis sesuatu di sepanjang baris ini:
Poin utama yang perlu dipahami di sini adalah bahwa daftar hanyalah kasus khusus dari iterable, yang merupakan objek seperti yang lainnya; dan bahwa
for ... in
loop dalam python dapat bekerja dengan variabel tuple, sehingga mudah untuk mengulang pada beberapa variabel secara bersamaan.sumber
Gunakan pemahaman daftar sederhana:
Ini memiliki semua keuntungan dari pendekatan terbaru menggunakan Generalisasi Unpacking Tambahan - yaitu Anda dapat menggabungkan jumlah acak berbagai iterables (misalnya, daftar, tuple, rentang, dan generator) dengan cara itu - dan itu tidak terbatas pada Python 3.5 atau lebih baru .
sumber
Cara yang sangat ringkas untuk menggabungkan daftar adalah
yang memberi kita
sumber
list.__add__
, gunakanoperator.add
saja. Ini adalah padanansum(list_of_lists, [])
yang lebih bertele-tele yang sama buruknya. JANGAN GUNAKAN!obj.__class__
danobj.__dict__
.Dengan Python Anda dapat menggabungkan dua array dimensi yang kompatibel dengan perintah ini
sumber
Jadi ada dua cara mudah.
+
: Ini membuat daftar baru dari daftar yang disediakanContoh:
Contoh:
Jadi kita melihat bahwa dari dua metode paling populer,
extend
adalah efisien.sumber
chain.from_iterable
).Ada beberapa cara untuk menggabungkan daftar dalam python.
sumber
Keluaran:
sumber
Jika Anda menginginkan daftar baru sambil menyimpan dua daftar lama:
sumber
sumber
Anda dapat mengikuti kode tersebut
sumber