def common_elements(list1, list2):
"""
Return a list containing the elements which are in both list1 and list2
>>> common_elements([1,2,3,4,5,6], [3,5,7,9])
[3, 5]
>>> common_elements(['this','this','n','that'],['this','not','that','that'])
['this', 'that']
"""
for element in list1:
if element in list2:
return list(element)
Sudah sejauh ini, tetapi tampaknya tidak bisa berfungsi!
Ada ide?
Jawaban:
sumber
Anda juga dapat menggunakan set dan mendapatkan kesamaan dalam satu baris: kurangi set yang berisi perbedaan dari salah satu set.
sumber
Solusi yang disarankan oleh S.Mark dan SilentGhost umumnya memberi tahu Anda bagaimana hal itu harus dilakukan dengan cara Pythonic, tetapi saya pikir Anda mungkin juga mendapat manfaat dari mengetahui mengapa solusi Anda tidak berhasil. Masalahnya adalah segera setelah Anda menemukan elemen umum pertama dalam dua daftar, Anda mengembalikan elemen tunggal saja. Solusi Anda dapat diperbaiki dengan membuat
result
daftar dan mengumpulkan elemen-elemen umum dalam daftar itu:Versi yang lebih pendek menggunakan daftar pemahaman:
Namun, seperti yang saya katakan, ini adalah cara yang sangat tidak efisien untuk melakukan hal ini - jenis himpunan built-in Python jauh lebih efisien karena diterapkan dalam C secara internal.
sumber
gunakan set persimpangan, set (list1) & set (list2)
Perhatikan bahwa daftar hasil dapat berbeda urutannya dengan daftar asli.
sumber
Anda dapat menggunakan pemahaman daftar sederhana:
sumber
Set adalah cara lain kita bisa menyelesaikan ini
sumber
list1 = [1,2,3,4,5,6] list2 = [3,5,7,9]
Saya tahu 3 cara dapat menyelesaikan ini, Tentu saja, mungkin ada lebih banyak.
1-
2-
3 -
Cara ke-3 adalah yang tercepat karena Sets diimplementasikan menggunakan tabel hash.
sumber
Jawaban sebelumnya semuanya berfungsi untuk menemukan elemen umum yang unik, tetapi akan gagal memperhitungkan item berulang dalam daftar. Jika Anda ingin elemen umum muncul dalam jumlah yang sama seperti yang ditemukan pada daftar, Anda dapat menggunakan satu-baris berikut:
Bagian
or True
ini hanya diperlukan jika Anda mengharapkan elemen untuk dievaluasiFalse
.sumber
set
yang tidak stabil (alias urutannya hilang).Saya membandingkan setiap metode yang disebutkan setiap jawaban. Saat ini saya menggunakan python 3.6.3 untuk implementasi ini. Ini adalah kode yang saya gunakan:
Jika Anda menjalankan kode ini, Anda dapat melihat bahwa jika Anda menggunakan daftar atau generator (jika Anda beralih lebih dari generator, tidak hanya menggunakannya. Saya melakukan ini ketika saya memaksa generator untuk mencetak panjangnya), Anda mendapatkan kinerja yang hampir sama. Tetapi jika Anda menggunakan set Anda mendapatkan kinerja yang jauh lebih baik. Juga jika Anda menggunakan metode persimpangan Anda akan mendapatkan kinerja yang sedikit lebih baik. hasil dari setiap metode di komputer saya tercantum di bawah ini:
sumber
ini proposisi saya, saya pikir lebih mudah dengan set daripada dengan for loop
sumber
Kenapa tidak digunakan
list comprehension
?Solusi setengah garis:
sumber
1) Method1 menyimpan list1 adalah kamus dan kemudian mengulangi setiap elem di list2
Menemukan elemen Umum dan Berbeda:
2) Metode2 menggunakan set
sumber
Gunakan generator:
Keuntungannya di sini adalah ini akan kembali dalam waktu yang konstan (hampir instan) bahkan ketika menggunakan daftar besar atau iterables besar lainnya.
Sebagai contoh,
Semua jawaban lain di sini akan memakan waktu sangat lama dengan nilai-nilai ini untuk list1 dan list2.
Anda kemudian dapat mengulangi jawabannya dengan
Atau mengonversinya menjadi daftar dengan
sumber
for i in common: print(i)
. Generator adalah iterables yang sering digunakan sebagai pengganti iterables lain seperti daftar.