Saya mencari yang setara dengan python dictionary.get(key, default)
untuk daftar. Apakah ada idiom satu liner untuk mendapatkan elemen ke-n dari daftar atau nilai default jika tidak tersedia?
Misalnya, diberi daftar myList yang ingin saya dapatkan myList[0]
, atau 5 jika myList
daftar kosong.
Terima kasih.
index == -1000000
harus kembalidefault
.x[index] if 0 <= index < len(x) else default
akan lebih baik jikaindex
bisa menjadi negatif.valid_index()
salah. Indeks negatif yang legal di Python - itu harus-len(l) <= index < len(l)
.Sunting: Saya menghapus centang untuk TypeError - mungkin lebih baik untuk membiarkan penelepon menangani ini.
sumber
Ini mungkin lebih baik karena
a
semakin besarIni berfungsi karena jika
a[n:]
daftar kosong jikan => len(a)
Berikut adalah contoh cara kerjanya
range(5)
Dan ekspresi penuh
sumber
next(iter(lst[i:i+1]), default)
- Hanya entri lain dalam kompetisi one-liners jelek yang samar.Baru menemukan bahwa:
iter(l)
mengembalikan iterator aktifmyList
,next()
mengkonsumsi elemen pertama iterator, dan memunculkanStopIteration
kesalahan kecuali jika dipanggil dengan nilai default, yang merupakan kasus di sini, argumen kedua,5
Ini hanya berfungsi ketika Anda menginginkan elemen ke-1, yang merupakan kasus dalam contoh Anda, tetapi tidak dalam teks pertanyaan Anda, jadi ...
Selain itu, tidak perlu membuat daftar sementara di memori dan berfungsi untuk semua jenis iterable, bahkan jika itu tidak memiliki nama (lihat komentar Xiong Chiamiov pada jawaban gruszczy)
sumber
next(iter(myList[n:n+1]), 5)
Sekarang berfungsi untukn
elemen th.try
varian bukanlah satu-kapal (ask diminta oleh OP). Ini hanya berfungsi untuk daftar karenamyList
merupakan daftar yang ditentukan oleh OP (lebih tepatnya, ini adalah sesuatu yang dapat diindeks). Membuat salinan dalam memori tidak mahal di sini karena saya membuat daftar satu elemen tunggal (atau tidak ada) di sini. Tentu, sedikit overhead, tetapi tidak layak disebutkan kecuali Anda melakukannya jutaan kali dalam satu lingkaran. Btw, saya kira membuat dan menangkapIndexError
pengecualian mungkin lebih mahal.sumber
[] or ...
dilakukannya. Namun, saya pribadi hanya akan menggunakan solusi yang diterima, karena mudah dibaca (untuk pemula). Memang, membungkusnya dalam 'def' dengan komentar akan membuat sebagian besar tidak menjadi masalah.L[n] == False
atauL[n] == None
atauL[n] == []
lebih global apa pun yang mengevaluasi ke False?[False]
itu benar.myval = l[n:n+1] or [somedefault]
akan bekerja dengan baik?Ada resep itertools yang melakukan ini untuk iterables umum. Untuk kenyamanan, Anda dapat
> pip install more_itertools
dan mengimpor perpustakaan pihak ketiga ini yang mengimplementasikan resep tersebut untuk Anda:Kode
Detail
Berikut adalah implementasi
nth
resepnya:Seperti
dict.get()
, alat ini mengembalikan default untuk indeks yang hilang. Itu berlaku untuk iterables umum:sumber
Solusi murah adalah benar-benar membuat dikte dengan penghitungan dan digunakan
.get()
seperti biasa, sepertisumber
Menggabungkan @ Joachim dengan yang di atas, bisa Anda gunakan
Contoh:
Atau, mungkin lebih jelas, tetapi tanpa
len
sumber
Menggunakan Python 3.4
contextlib.suppress(exceptions)
untuk membangungetitem()
metode yang mirip dengangetattr()
.sumber