Apakah ada orang di sini yang memiliki kode berguna yang menggunakan fungsi reduce () di python? Apakah ada kode selain + dan * biasa yang kita lihat di contoh?
Lihat Fate of reduce () dengan Python 3000 oleh GvR
Apakah ada orang di sini yang memiliki kode berguna yang menggunakan fungsi reduce () di python? Apakah ada kode selain + dan * biasa yang kita lihat di contoh?
Lihat Fate of reduce () dengan Python 3000 oleh GvR
from functools import reduce
memungkinkan kode yang sama untuk bekerja pada Python 2 dan 3.Jawaban:
Kegunaan lain yang saya temukan untuk itu selain + dan * dulu dengan dan atau, tetapi sekarang kami memiliki
any
danall
mengganti kasing tersebut.foldl
danfoldr
sering muncul di Skema ...Inilah beberapa penggunaan lucu:
Ratakan daftar
Sasaran: berubah
[[1, 2, 3], [4, 5], [6, 7, 8]]
menjadi[1, 2, 3, 4, 5, 6, 7, 8]
.Daftar digit angka
Sasaran: berubah
[1, 2, 3, 4, 5, 6, 7, 8]
menjadi12345678
.Jelek, cara lambat:
reduce
Cara yang cantik :sumber
timeit.repeat('int("".join(map(str, digit_list)))', setup = 'digit_list = list(d%10 for d in xrange(1,1000))', number=1000)
membutuhkan ~ 0,09 detik sementaratimeit.repeat('reduce(lambda a,d: 10*a+d, digit_list)', setup = 'digit_list = list(d%10 for d in xrange(1,1000))', number=1000)
membutuhkan 0,36 detik (sekitar 4 kali lebih lambat). Pada dasarnya perkalian dengan 10 menjadi mahal ketika daftarnya menjadi besar, sementara int ke str dan penggabungan tetap murah.timeit.repeat('convert_digit_list_to_int(digit_list)', setup = 'digit_list = [d%10 for d in xrange(1,10)]\ndef convert_digit_list_to_int(digits):\n i = 0\n for d in digits:\n i = 10*i + d\n return i', number=100000)
membutuhkan 0,06 detik,timeit.repeat('reduce(lambda a,d: 10*a+d, digit_list)', setup = 'digit_list = list(d%10 for d in xrange(1,10))', number=100000)
membutuhkan 0,12 detik dan mengubah angka menjadi metode str membutuhkan 0,16 detik.reduce()
dapat digunakan untuk mencari kelipatan persekutuan terkecil untuk 3 angka atau lebih :Contoh:
sumber
lcm
di baris kedua?lcm()
mengembalikan kelipatan persekutuan terkecil dari dua angka.reduce()
dapat digunakan untuk menyelesaikan nama putus-putus (eval()
yang terlalu tidak aman untuk digunakan):sumber
Temukan perpotongan N daftar yang diberikan:
kembali:
via: Python - Persimpangan dua daftar
sumber
Saya pikir mengurangi adalah perintah konyol. Karenanya:
sumber
Penggunaan
reduce
yang saya temukan dalam kode saya melibatkan situasi di mana saya memiliki beberapa struktur kelas untuk ekspresi logika dan saya perlu mengonversi daftar objek ekspresi ini ke sambungan ekspresi. Saya sudah memiliki fungsimake_and
untuk membuat hubungan dengan dua ekspresi, jadi saya menulisreduce(make_and,l)
. (Saya tahu daftarnya tidak kosong; jika tidak maka akan menjadi seperti inireduce(make_and,l,make_true)
.)Inilah alasan sebenarnya mengapa (beberapa) pemrogram fungsional menyukai
reduce
(atau melipat fungsi, seperti fungsi biasanya disebut). Ada sering sudah banyak fungsi biner seperti+
,*
,min
,max
, Rangkaian dan, dalam kasus saya,make_and
danmake_or
. Memiliki areduce
membuatnya mudah untuk mengangkat operasi ini ke daftar (atau pohon atau apa pun yang Anda dapatkan, untuk fungsi lipat secara umum).Tentu saja, jika instansiasi tertentu (seperti
sum
) sering digunakan, maka Anda tidak ingin terus menulisreduce
. Namun, alih-alih mendefinisikansum
dengan beberapa for-loop, Anda dapat dengan mudah mendefinisikannya denganreduce
.Keterbacaan, seperti yang disebutkan oleh orang lain, memang menjadi masalah. Namun, Anda dapat berargumen bahwa satu-satunya alasan mengapa orang merasa
reduce
kurang "jelas" adalah karena ini bukan fungsi yang diketahui dan / atau digunakan banyak orang.sumber
and
operator:L and reduce(make_and, L)
jika mengembalikan daftar kosong sesuai dalam kasus iniKomposisi fungsi : Jika Anda sudah memiliki daftar fungsi yang ingin Anda terapkan secara berurutan, seperti:
Kemudian Anda dapat menerapkan semuanya secara berurutan dengan:
Dalam kasus ini, rangkaian metode mungkin lebih mudah dibaca. Tetapi terkadang tidak mungkin, dan komposisi semacam ini mungkin lebih mudah dibaca dan dipelihara daripada
f1(f2(f3(f4(x))))
sejenis sintaks.sumber
Anda bisa mengganti
value = json_obj['a']['b']['c']['d']['e']
dengan:Jika Anda sudah memiliki jalur
a/b/c/..
sebagai daftar. Misalnya, Ubah nilai dalam dikt dari dicts bersarang menggunakan item dalam daftar .sumber
@Blair Conrad: Anda juga bisa menerapkan glob / reduce menggunakan jumlah, seperti:
Ini kurang bertele-tele daripada salah satu dari dua contoh Anda, Pythonic sempurna, dan masih hanya satu baris kode.
Jadi untuk menjawab pertanyaan awal, saya pribadi mencoba menghindari penggunaan pengurangan karena tidak pernah benar-benar diperlukan dan menurut saya kurang jelas dibandingkan pendekatan lainnya. Namun, beberapa orang terbiasa mengurangi dan memilihnya untuk daftar pemahaman (terutama programmer Haskell). Tetapi jika Anda belum memikirkan suatu masalah dalam hal pengurangan, Anda mungkin tidak perlu khawatir untuk menggunakannya.
sumber
sum
danreduce
mengarah pada perilaku kuadrat. Hal ini dapat dilakukan dalam waktu linier:files = chain.from_iterable(imap(iglob, args))
. Meskipun mungkin tidak masalah dalam kasus ini karena waktu yang dibutuhkan untuk glob () mengakses disk.reduce
dapat digunakan untuk mendukung pencarian atribut yang dirantai:Tentu saja, ini sama dengan
tetapi berguna ketika kode Anda perlu menerima daftar atribut yang berubah-ubah.
(Atribut berantai dengan panjang sembarang adalah umum ketika berhadapan dengan model Django.)
sumber
reduce
berguna ketika Anda perlu menemukan penyatuan atau perpotongan urutanset
objek -seperti.(Terlepas dari
set
s sebenarnya , contohnya adalah objek Q Django .)Di sisi lain, jika Anda berurusan dengan
bool
s, Anda harus menggunakanany
danall
:sumber
Setelah grep kode saya, tampaknya satu-satunya hal yang saya gunakan untuk mengurangi adalah menghitung faktorial:
sumber
Saya sedang menulis fungsi compose untuk sebuah bahasa, jadi saya membuat fungsi compose menggunakan reduce bersama dengan operator apply saya.
Singkatnya, compose mengambil daftar fungsi untuk dibuat menjadi satu fungsi. Jika saya memiliki operasi kompleks yang diterapkan secara bertahap, saya ingin menggabungkan semuanya seperti ini:
Dengan cara ini, saya kemudian dapat menerapkannya ke ekspresi seperti ini:
Dan saya ingin itu setara dengan:
Sekarang, untuk membangun objek internal saya, saya ingin mengatakan:
(Kelas Lambda membangun fungsi yang ditentukan pengguna, dan Apply membangun aplikasi fungsi.)
Sekarang, sayangnya, kurangi lipatan dengan cara yang salah, jadi saya akhirnya menggunakan, secara kasar:
Untuk mengetahui apa yang mengurangi produksi, coba ini di REPL:
sumber
compose = lambda *func: lambda arg: reduce(lambda x, f: f(x), reversed(funcs), arg)
untuk menghasilkan semua kemungkinan kombinasi dari fungsi untuk pengujian kinerja.mengurangi dapat digunakan untuk mendapatkan daftar dengan elemen ke maksimum
akan mengembalikan [5, 2, 5, 7] karena ini adalah daftar dengan maks elemen ke-3 +
sumber
Mengurangi tidak terbatas pada operasi skalar; itu juga dapat digunakan untuk menyortir barang ke dalam ember. (Ini yang paling sering saya gunakan untuk mengurangi).
Bayangkan sebuah kasus di mana Anda memiliki daftar objek, dan Anda ingin menata ulang secara hierarki berdasarkan properti yang disimpan secara datar di objek. Dalam contoh berikut, saya membuat daftar objek metadata yang terkait dengan artikel di surat kabar berenkode XML dengan
articles
fungsi tersebut.articles
menghasilkan daftar elemen XML, dan kemudian memetakannya satu per satu, menghasilkan objek yang menyimpan beberapa info menarik tentangnya. Di bagian depan, saya ingin membiarkan pengguna menelusuri artikel berdasarkan bagian / subbagian / tajuk utama. Jadi saya gunakanreduce
untuk mengambil daftar artikel dan mengembalikan satu kamus yang mencerminkan hierarki bagian / subbagian / artikel.Saya memberikan kedua fungsi di sini karena menurut saya ini menunjukkan bagaimana map dan reduce dapat saling melengkapi dengan baik ketika berhadapan dengan objek. Hal yang sama dapat dilakukan dengan for loop, ... tetapi menghabiskan waktu serius dengan bahasa fungsional cenderung membuat saya berpikir dalam kerangka peta dan mengurangi.
Ngomong-ngomong, jika ada yang memiliki cara yang lebih baik untuk menyetel properti seperti yang saya lakukan
extract
, di mana orang tua properti yang ingin Anda setel mungkin belum ada, beri tahu saya.sumber
Tidak yakin apakah ini yang Anda cari tetapi Anda dapat mencari kode sumber di Google .
Ikuti link untuk pencarian di 'function: reduce () lang: python' di pencarian Google Code
Sekilas penggunaan proyek berikut
reduce()
dll. dll tetapi kemudian ini tidak mengejutkan karena mereka adalah proyek besar.
Fungsi pengurangan dapat dilakukan dengan menggunakan rekursi fungsi yang menurut saya Guido pikir lebih eksplisit.
Memperbarui:
Sejak Pencarian Kode Google dihentikan pada 15-Jan-2012, selain kembali ke pencarian Google biasa, ada sesuatu yang disebut Koleksi Cuplikan Kode yang terlihat menjanjikan. Sejumlah sumber lain disebutkan dalam menjawab pertanyaan (tertutup) ini tentang Penggantian untuk Google Code Search? .
Pembaruan 2 (29-Mei-2017):
Sumber yang baik untuk contoh Python (dalam kode sumber terbuka) adalah mesin pencari Nullege .
sumber
for
loop.lang:python "reduce("
akan menemukan definisireduce
tergantung pada gaya pengkodean kode sumber.sumber
sumber
Saya biasa
reduce
menggabungkan daftar vektor pencarian PostgreSQL dengan||
operator di sqlalchemy-searchable:sumber
Saya memiliki implementasi pipegrep Python lama yang menggunakan reduce dan modul glob untuk membuat daftar file untuk diproses:
Saya merasa itu berguna pada saat itu, tetapi sebenarnya tidak perlu, karena sesuatu yang serupa sama baiknya, dan mungkin lebih mudah dibaca
sumber
files = [glob.glob(f) for f in args]
itertools
, menggunakanflatten()
resep dari docs.python.org/library/itertools.html , dan kemudian menulis:files = flatten(glob.glob(f) for f in args)
(Dan kali ini, saya menguji kode sebelum mempostingnya, dan saya tahu ini berfungsi dengan benar.)files = chain.from_iterable(imap(iglob, args))
di manachain
,imap
dariitertools
modul danglob.iglob
berguna jika pola dariargs
dapat menghasilkan file dari beberapa direktori.Katakanlah ada beberapa data statistik tahunan yang menyimpan daftar Penghitung. Kami ingin menemukan nilai MIN / MAX setiap bulan di tahun yang berbeda. Misalnya, untuk Januari akan menjadi 10. Dan untuk Februari akan menjadi 15. Kami perlu menyimpan hasilnya di Penghitung baru.
sumber
Saya memiliki objek yang mewakili beberapa jenis interval yang tumpang tindih (ekson genom), dan mendefinisikan ulang persimpangannya menggunakan
__and__
:Kemudian ketika saya memiliki koleksi mereka (misalnya, dalam gen yang sama), saya gunakan
sumber
Saya baru saja menemukan penggunaan berguna dari
reduce
: memisahkan string tanpa menghapus pembatas . Kode sepenuhnya dari blog Programatically Speaking. Berikut kodenya:Inilah hasilnya:
Perhatikan bahwa itu menangani kasus tepi yang jawaban populer di SO tidak. Untuk penjelasan lebih mendalam, saya mengarahkan Anda ke postingan blog asli.
sumber
Menggunakan reduce () untuk mengetahui apakah daftar tanggal berurutan:
sumber