Saya seorang pemula python yang mencoba mencapai yang berikut:
Saya punya daftar daftar:
lst = [[567,345,234],[253,465,756, 2345],[333,777,111, 555]]
Saya ingin memetakan lst ke dalam daftar lain yang hanya berisi nomor terkecil kedua dari setiap sublist. Jadi hasilnya seharusnya:
[345, 465, 333]
Misalnya jika saya hanya tertarik pada angka terkecil, saya dapat melakukan:
map(lambda x: min(x),lst)
Saya berharap saya bisa melakukan ini:
map(lambda x: sort(x)[1],lst)
tapi semacam tidak berantai. (mengembalikan Tidak ada)
hal seperti ini tidak diperbolehkan:
map(lambda x: sort(x); x[1],lst) #hence the multiple statement question
Apakah ada cara untuk melakukan ini dengan map dengan python tetapi tanpa mendefinisikan fungsi bernama ? (mudah dengan blok anonim di ruby, misalnya)
lambda x: sort(x) OR x[1]
akan berfungsi: Di sini OR mengevaluasi argumen pertamanya (nilai kembalian None) sebagai bool (=> False), dan dalam kasus itu ATAU mengembalikan argumen keduanya. Tetapi seperti yang dikatakan jawabannya, lebih baik hindari lambda.Jawaban:
Ada beberapa jawaban berbeda yang dapat saya berikan di sini, dari pertanyaan spesifik Anda hingga masalah yang lebih umum. Jadi dari yang paling spesifik hingga yang paling umum:
T. Dapatkah Anda meletakkan banyak pernyataan dalam lambda?
J. Tidak. Tapi Anda sebenarnya tidak perlu menggunakan lambda. Anda dapat meletakkan pernyataan di file
def
. yaitu:T. Bisakah Anda mendapatkan item terendah kedua dari lambda dengan mengurutkan daftar?
A. Ya. Seperti yang ditunjukkan oleh jawaban alex ,
sorted()
adalah versi sortir yang membuat daftar baru, bukan mengurutkan di tempat, dan dapat dirantai. Perhatikan bahwa ini mungkin yang seharusnya Anda gunakan - praktik yang buruk jika peta Anda memiliki efek samping pada daftar aslinya.T. Bagaimana cara mendapatkan item terendah kedua dari setiap daftar dalam urutan daftar?
A.
sorted(l)[1]
sebenarnya bukan cara terbaik untuk ini. Ini memiliki kompleksitas O (N log (N)), sementara solusi O (n) ada. Ini dapat ditemukan di modul heapq.Jadi gunakan saja:
Ini juga biasanya dianggap lebih jelas untuk menggunakan pemahaman daftar, yang menghindari lambda sama sekali:
sumber
k
(seperti di sini dengan 'terendah kedua')O(k*log(n)+n)
disederhanakan menjadiO(n)
Menempatkan pernyataan dalam daftar dapat mensimulasikan beberapa pernyataan:
Misalnya:
sumber
None
.Penjelajah waktu di sini. Jika Anda secara umum ingin memiliki beberapa pernyataan dalam lambda, Anda bisa meneruskan lambda lain sebagai argumen ke lambda itu.
Anda sebenarnya tidak dapat memiliki beberapa pernyataan, tetapi Anda dapat mensimulasikannya dengan meneruskan lambda ke lambda.
Sunting: Penjelajah waktu kembali! Anda juga dapat menyalahgunakan perilaku ekspresi boolean (dengan mengingat aturan dan kejujuran arus pendek) ke operasi rantai. Menggunakan operator terner memberi Anda lebih banyak daya. Sekali lagi, Anda tidak dapat memiliki banyak pernyataan , tetapi tentu saja Anda dapat memiliki banyak pemanggilan fungsi. Contoh ini melakukan beberapa sampah sembarangan dengan sekumpulan data, tetapi, ini menunjukkan bahwa Anda dapat melakukan beberapa hal lucu. Pernyataan cetak adalah contoh fungsi yang kembali
None
(seperti halnya.sort()
metode) tetapi juga membantu menunjukkan apa yanglambda
dilakukannya.sumber
Gunakan fungsi yang diurutkan , seperti ini:
sumber
[sorted(x)[1] for x in list_of_lists]
.Anda sebenarnya dapat memiliki beberapa pernyataan dalam ekspresi lambda dengan python. Ini tidak sepenuhnya sepele tetapi dalam contoh Anda, karya-karya berikut ini:
Anda harus memastikan bahwa setiap pernyataan tidak mengembalikan apa pun atau jika pernyataan itu membungkusnya dengan (.. dan False). Hasilnya adalah apa yang dikembalikan oleh evaluasi terakhir.
Contoh:
sumber
Menggunakan begin () dari sini: http://www.reddit.com/r/Python/comments/hms4z/ask_pyreddit_if_you_were_making_your_own/c1wycci
sumber
Cara Hacky untuk menggabungkan beberapa pernyataan menjadi satu pernyataan di python adalah dengan menggunakan kata kunci "dan" sebagai operator sirkuit pendek. Kemudian Anda dapat menggunakan pernyataan tunggal ini secara langsung sebagai bagian dari ekspresi lambda.
Ini mirip dengan menggunakan "&&" sebagai operator sirkuit pendek dalam bahasa shell seperti bash.
Perhatikan juga: Anda selalu dapat memperbaiki pernyataan fungsi untuk mengembalikan nilai sebenarnya dengan membungkus fungsi.
Contoh:
Setelah dipikir-pikir, mungkin lebih baik menggunakan 'atau' daripada 'dan' karena banyak fungsi mengembalikan '0' atau Tidak ada saat berhasil. Kemudian Anda dapat menghilangkan fungsi pembungkus pada contoh di atas:
'dan' operasikan akan mengevaluasi ekspresi hingga mencapai nilai pengembalian nol pertama. setelah itu korsleting. 1 dan 1 dan 0 dan 1 mengevaluasi: 1 dan 1 dan 0, dan menjatuhkan 1
'atau' operasikan akan mengevaluasi ekspresi hingga mencapai nilai pengembalian bukan nol pertama. setelah itu korsleting.
0 atau 0 atau 1 atau 0 mengevaluasi 0 atau 0 atau 1, dan menjatuhkan 0
sumber
Atau jika Anda ingin menghindari lambda dan memiliki generator alih-alih daftar:
(diurutkan (col) [1] untuk kolom pertama)
sumber
Izinkan saya mempersembahkan kepada Anda peretasan yang mulia namun menakutkan:
Anda sekarang dapat menggunakan
LET
formulir ini seperti:pemberian yang mana:
[345, 465, 333]
sumber
Anda dapat melakukannya dalam waktu O (n) menggunakan min dan indeks daripada menggunakan sort atau heapq.
Pertama buat daftar baru semuanya kecuali nilai min dari daftar asli:
Kemudian ambil nilai min dari daftar baru:
Sekarang semuanya menjadi satu lambda:
Ya, ini benar-benar jelek, tetapi harus murah secara algoritme. Juga karena beberapa orang di utas ini ingin melihat pemahaman daftar:
sumber
Persis seperti inilah
bind
fungsi dalam sebuah Monad digunakan.Dengan
bind
fungsi tersebut Anda dapat menggabungkan beberapa lambda menjadi satu lambda, setiap lambda mewakili sebuah pernyataan.sumber
Sebenarnya ada cara untuk menggunakan banyak pernyataan di lambda. Inilah solusi saya:
sumber
exec
tidak dapatIya. Anda dapat mendefinisikannya dengan cara ini dan kemudian membungkus beberapa ekspresi Anda dengan yang berikut:
Skema dimulai:
mulai = lambda * x: x [-1]
Progn Lisp umum:
progn = lambda * x: x [-1]
sumber
Ada solusi yang lebih baik tanpa menggunakan fungsi lambda. Tetapi jika kita benar-benar ingin menggunakan fungsi lambda, berikut adalah solusi umum untuk menangani beberapa pernyataan: map (lambda x: x [1] if (x.sort ()) else x [1], lst)
Anda tidak terlalu peduli apa yang dikembalikan pernyataan itu.
sumber
Ya itu mungkin. Coba potongan kode di bawah ini.
sumber
Saya akan memberikan solusi lain, Jadikan lambda Anda memanggil fungsi.
sumber
junky = multiple_statements
.