Saya punya daftar dengan string numerik, seperti:
numbers = ['1', '5', '10', '8'];
Saya ingin mengonversi setiap elemen daftar menjadi bilangan bulat, jadi akan terlihat seperti ini:
numbers = [1, 5, 10, 8];
Saya bisa melakukannya menggunakan loop, seperti:
new_numbers = [];
for n in numbers:
new_numbers.append(int(n));
numbers = new_numbers;
Apakah itu harus begitu jelek? Saya yakin ada cara yang lebih pythonic untuk melakukan ini dalam satu baris kode. Tolong bantu saya.
Jawaban:
Inilah yang dimaksudkan untuk pemahaman daftar :
sumber
Dalam Python 2.x pendekatan lain adalah menggunakan
map
:Catatan: dengan Python 3.x
map
mengembalikan objek peta yang bisa Anda konversi ke daftar jika Anda mau:sumber
map
mengembalikan iterator bukan daftar, jadi perlu dituliskan seolah-list(map(int, numbers))
olah daftar diperlukan.map
memiliki overhead pengaturan yang lebih tinggi, tetapi pada penerjemah referensi, jika fungsi transformasi adalah fungsi bawaan Python diimplementasikan dalam C, ia memiliki biaya per item yang lebih rendah. Menguji input hanya dengan empat nilai tidak akan memberikan informasi yang berguna tentang penskalaan. Yang mengatakan, dalam pengujian saya sendiri (pada Py2.7.12 dan Py3.5.2, yang terakhir denganlist()
pembungkus), Py2 denganmap
menang bahkan untuk empat input elemen, dan kalah dengan hanya selisih kecil pada Py3; Saya menduga tes Anda bengkok mendukung listcomps.hanya satu poin,
Pemahaman daftar lebih alami, sementara
lebih cepat.
Mungkin ini tidak masalah dalam banyak kasus
Berguna baca: LP vs peta
sumber
Jika Anda bermaksud meneruskan bilangan bulat itu ke fungsi atau metode, pertimbangkan contoh ini:
Konstruksi ini sengaja sangat mirip dengan daftar pemahaman yang disebutkan oleh adamk. Tanpa tanda kurung siku, itu disebut ekspresi generator , dan merupakan cara yang sangat efisien dalam melewati daftar argumen ke suatu metode. Diskusi yang baik tersedia di sini: Ekspresi Generator vs. Pemahaman Daftar
sumber
Cara lain untuk membuatnya di Python 3:
numbers = [*map(int, numbers)]
sumber
[]
mengambil daftar argumen. Dan, saya tidak tahu Anda bisa melewati iterator sebagai daftar argumen. Saya akan berpikir untuk melakukannyanumber = list(map(int, numbers))
. Tapi terima kasih atas penjelasannya!Cara lain,
sumber
Kupikir aku akan menggabungkan jawaban dan menunjukkan beberapa
timeit
hasil.Python 2 sangat buruk dalam hal ini, tetapi
map
sedikit lebih cepat daripada pemahaman.Python 3 lebih cepat 4x dari dirinya sendiri, tetapi mengubah
map
objek generator ke daftar masih lebih cepat daripada pemahaman, dan membuat daftar dengan membongkarmap
generator (terima kasih Artem!) Masih sedikit lebih cepat.Catatan: Dalam Python 3, 4 elemen tampaknya menjadi titik crossover (3 dalam Python 2) di mana pemahamannya sedikit lebih cepat, meskipun membongkar generator masih lebih cepat daripada daftar dengan lebih dari 1 elemen.
sumber