Saya perlu memilih beberapa elemen dari daftar yang diberikan, mengetahui indeksnya. Katakanlah saya ingin membuat daftar baru, yang berisi elemen dengan indeks 1, 2, 5, dari daftar yang diberikan [-2, 1, 5, 3, 8, 5, 6]. Apa yang saya lakukan adalah:
a = [-2,1,5,3,8,5,6]
b = [1,2,5]
c = [ a[i] for i in b]
Apakah ada cara yang lebih baik untuk melakukannya? sesuatu seperti c = a [b]?
lambda
fungsi.Jawaban:
Anda bisa menggunakan
operator.itemgetter
:Atau Anda bisa menggunakan numpy :
Tapi sungguh, solusi Anda saat ini baik-baik saja. Mungkin yang paling rapi dari semuanya.
sumber
c = [a[i] for i in b]
tidak masalah. Perhatikan bahwaitemgetter
solusi tidak akan melakukan hal yang sama jika b memiliki kurang dari 2 elemen.a[b]
bekerja hanya ketikaa
adalah numpy array, yaitu Anda menciptakannya dengan fungsi numpy.Alternatif:
sumber
build-in
fungsi__getitem__
tampaknya tidak komparabel misalnya bagaimana memetakan jenis item?map(type(a.__getitem__), b)
lambda x: type(a.__getitem__(x)), b
,. Dalam hal ini menggunakan[..]
lebih kompak:lambda x: type(a[x]), b
Solusi lain bisa melalui Seri panda:
Anda kemudian dapat mengonversi c kembali ke daftar jika Anda ingin:
sumber
Pengujian dasar dan tidak sangat ekstensif membandingkan waktu pelaksanaan dari lima jawaban yang disediakan:
menggunakan input berikut:
python loop sederhana adalah yang tercepat dengan operasi lambda sedetik dekat, mapIndexValues dan getIndexValues secara konsisten sangat mirip dengan metode numpy secara signifikan lebih lambat setelah mengkonversi daftar ke array numpy. Jika data sudah dalam array numpy, metode numpyIndexValues dengan numpy. tercepat.
sumber
numpyIndexValues
tidak bekerja karenaa
,b
adalah tiperange
. Saya menduga bahwa Anda ment mengkonversia
,b
untuknumpy.ndarrays
pertama?Saya yakin ini sudah dipertimbangkan: Jika jumlah indeks dalam b kecil dan konstan, kita bisa menuliskan hasilnya seperti:
Atau bahkan lebih sederhana jika indeks itu sendiri adalah konstanta ...
Atau jika ada kisaran indeks berurutan ...
sumber
[a] + [b] = [a, b]
Inilah cara yang lebih sederhana:
sumber
Jawaban saya tidak menggunakan koleksi numpy atau python.
Satu cara sepele untuk menemukan elemen adalah sebagai berikut:
Kelemahan: Metode ini mungkin tidak berfungsi untuk daftar yang lebih besar. Disarankan menggunakan numpy untuk daftar yang lebih besar.
sumber
a
.[a[i] for i in b]
a
ada 5 lainnya di dalamnya?[a[i] if i<len(a) else None for i in b]
Indeks statis dan daftar kecil?
Jangan lupa bahwa jika daftar kecil dan indeks tidak berubah, seperti dalam contoh Anda, kadang-kadang hal terbaik adalah menggunakan urutan pembongkaran :
Performanya jauh lebih baik dan Anda juga dapat menyimpan satu baris kode:
sumber
Jenis cara pythonic:
sumber
O(n)
solusi mereka menjadiO(n^2)
solusi sementara juga hampir dua kali lipat panjang kode. Anda juga ingin mencatat bahwa pendekatan akan gagal jika daftar berisi objek akan kabur atau kesetaraan parsial, misalnya jikaa
berisifloat('nan')
, ini akan selalu meningkatkan aValueError
.