Saya bertanya-tanya apa cara terbaik untuk mengekstrak item pertama dari masing-masing sublist dalam daftar daftar dan menambahkannya ke daftar baru. Jadi jika saya punya:
lst = [[a,b,c], [1,2,3], [x,y,z]]
dan saya ingin menarik keluar a
, 1
dan x
dan membuat daftar terpisah dari itu.
Saya mencoba:
lst2.append(x[0] for x in lst)
Jawaban:
Menggunakan pemahaman daftar :
sumber
Anda bisa menggunakan zip:
Atau, Python 3 di mana
zip
tidak menghasilkan daftar:Atau,
Atau, (favorit saya) gunakan numpy:
sumber
list
dulu atau gunakannext
. Terima kasihPunya masalah yang sama dan penasaran dengan kinerja masing-masing solusi.
Ini dia
%timeit
:Cara numpy pertama, mentransformasikan array:
Sepenuhnya asli menggunakan pemahaman daftar (seperti yang dijelaskan oleh @alecxe):
Cara asli lain menggunakan
zip
(seperti yang dijelaskan oleh @dawg):Cara numpy kedua. Juga dijelaskan oleh @dawg:
Anehnya (yah, setidaknya bagi saya) cara asli menggunakan daftar pemahaman adalah yang tercepat dan sekitar 10x lebih cepat daripada cara numpy. Menjalankan dua cara numpy tanpa final
list
menghemat sekitar satu μs yang masih dalam perbedaan 10x.Perhatikan bahwa, ketika saya mengepung setiap cuplikan kode dengan panggilan ke
len
, untuk memastikan bahwa Generator berjalan hingga akhir, waktunya tetap sama.sumber
Python menyertakan fungsi yang disebut itemgetter untuk mengembalikan item pada indeks tertentu dalam daftar:
Lewati itemgetter () berfungsi sebagai indeks item yang ingin Anda ambil. Untuk mengambil item pertama, Anda akan menggunakan itemgetter (0). Yang penting untuk dipahami adalah itemgetter (0) itu sendiri mengembalikan fungsi. Jika Anda meneruskan daftar ke fungsi itu, Anda mendapatkan item tertentu:
Ini berguna ketika Anda menggabungkannya dengan map (), yang menggunakan fungsi sebagai argumen pertama, dan daftar (atau yang bisa diubah) sebagai argumen kedua. Ini mengembalikan hasil memanggil fungsi pada setiap objek di iterable:
Perhatikan bahwa map () mengembalikan generator, sehingga hasilnya diteruskan ke list () untuk mendapatkan daftar aktual. Singkatnya, tugas Anda dapat dilakukan seperti ini:
Ini adalah metode alternatif untuk menggunakan pemahaman daftar, dan metode mana yang dipilih sangat tergantung pada konteks, keterbacaan, dan preferensi.
Info lebih lanjut: https://docs.python.org/3/library/operator.html#operator.itemgetter
sumber
Kode Anda hampir benar. Satu-satunya masalah adalah penggunaan daftar pemahaman.
Jika Anda menggunakan like: (x [0] untuk x in lst), ia mengembalikan objek generator. Jika Anda menggunakan like: [x [0] untuk x in lst], ia mengembalikan daftar.
Saat Anda menambahkan output pemahaman daftar ke daftar, output pemahaman daftar adalah elemen tunggal dari daftar.
lst2 = [['a', 1, 'x']]
lst2 [0] = ['a', 1, 'x']
Tolong beri tahu saya jika saya salah.
sumber
Keluaran:
['a', 1, 'x']
sumber
Anda mengatakan bahwa Anda memiliki daftar yang ada. Jadi saya akan pergi dengan itu.
Saat ini Anda menambahkan objek generator ke daftar kedua Anda.
Tetapi Anda mungkin ingin itu menjadi daftar item pertama
Sekarang kami menambahkan daftar item pertama ke daftar yang ada. Jika Anda ingin menambahkan item tema sendiri, bukan daftar item, ke item yang ada, Anda akan menggunakan list.extend. Dalam hal ini kita tidak perlu khawatir tentang menambahkan generator, karena extended akan menggunakan generator itu untuk menambahkan setiap item yang didapatnya dari sana, untuk memperpanjang daftar saat ini.
atau
https://docs.python.org/3.4/tutorial/datastructures.html#more-on-lists https://docs.python.org/3.4/tutorial/datastructures.html#list-comprehensions
sumber
append
dalam pertanyaan itu menyebabkan kebingungan. Kedengarannya seperti dia hanya ingin bagian pemahaman daftar solusi Anda.