Czy ktoś tutaj ma jakiś przydatny kod, który używa funkcji redukuj () w Pythonie? Czy istnieje kod inny niż zwykłe + i *, które widzimy w przykładach?
Zapoznaj się z losem redukuj () w Pythonie 3000 przez GvR
Czy ktoś tutaj ma jakiś przydatny kod, który używa funkcji redukuj () w Pythonie? Czy istnieje kod inny niż zwykłe + i *, które widzimy w przykładach?
Zapoznaj się z losem redukuj () w Pythonie 3000 przez GvR
from functools import reduce
pozwala temu samemu kodowi działać zarówno w Pythonie 2, jak i 3.Odpowiedzi:
Inne zastosowania, które znalazłem, oprócz + i *, były z i i lub, ale teraz mamy
any
iall
zastąpić te przypadki.foldl
ifoldr
często pojawiają się w Schemacie ...Oto kilka uroczych zastosowań:
Spłaszcz listę
Cel: obrócić
[[1, 2, 3], [4, 5], [6, 7, 8]]
się[1, 2, 3, 4, 5, 6, 7, 8]
.Lista cyfr do numeru
Cel: obrócić
[1, 2, 3, 4, 5, 6, 7, 8]
się12345678
.Brzydki, powolny sposób:
Ładny
reduce
sposób:źródło
timeit.repeat('int("".join(map(str, digit_list)))', setup = 'digit_list = list(d%10 for d in xrange(1,1000))', number=1000)
trwa ~ 0,09 sekundy, podczas gdytimeit.repeat('reduce(lambda a,d: 10*a+d, digit_list)', setup = 'digit_list = list(d%10 for d in xrange(1,1000))', number=1000)
zajmuje 0,36 sekundy (około 4 razy wolniej). Zasadniczo mnożenie przez 10 staje się kosztowne, gdy lista staje się duża, podczas gdy int do str i konkatenacja pozostają tanie.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)
zajmuje 0,06 s,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)
zajmuje 0,12 s, a konwersja cyfr na metodę str zajmuje 0,16 s.reduce()
można użyć do znalezienia najmniejszej wspólnej wielokrotności dla 3 lub więcej liczb :Przykład:
źródło
lcm
w drugiej linii?lcm()
zwraca najmniejszą wspólną wielokrotność dwóch liczb.reduce()
może być użyty do rozpoznawania nazw z kropkami (gdzieeval()
jest zbyt niebezpieczne):źródło
Znajdź przecięcie N podanych list:
zwroty:
via: Python - Przecięcie dwóch list
źródło
Myślę, że redukcja to głupie polecenie. W związku z tym:
źródło
Użycie tego,
reduce
które znalazłem w moim kodzie, wiązało się z sytuacją, w której miałem pewną strukturę klas dla wyrażeń logicznych i musiałem przekonwertować listę tych obiektów wyrażeń na koniunkcję wyrażeń. Miałem już funkcjęmake_and
tworzenia koniunkcji na podstawie dwóch wyrażeń, więc napisałemreduce(make_and,l)
. (Wiedziałem, że lista nie jest pusta; w przeciwnym razie byłoby to coś podobnegoreduce(make_and,l,make_true)
).To jest dokładnie powód, dla którego (niektórzy) programiści funkcyjni lubią
reduce
(lub zwijają funkcje, jak zwykle nazywa się takie funkcje). Są to często już wiele binarne funkcje, takie jak+
,*
,min
,max
, łączenie i, w moim przypadku,make_and
imake_or
. Mającyreduce
sprawia, że przenoszenie tych operacji do list (lub drzew lub czegokolwiek innego, ogólnie dla funkcji fold) jest trywialne.Oczywiście, jeśli
sum
często używane są pewne instancje (takie jak ), nie chcesz dalej pisaćreduce
. Jednak zamiast zdefiniowaniusum
z jakiegoś dla pętli, to można równie łatwo zdefiniować jąreduce
.Czytelność, jak wspominali inni, jest rzeczywiście problemem. Można jednak argumentować, że jedynym powodem, dla którego ludzie uważają, że jest
reduce
mniej „przejrzysty”, jest fakt, że nie jest to funkcja, którą wiele osób zna i / lub używa.źródło
and
operatora w zwarciu :L and reduce(make_and, L)
jeśli zwrócenie pustej listy jest w tym przypadku właściweKompozycja funkcji : jeśli masz już listę funkcji, które chcesz kolejno zastosować, na przykład:
Następnie możesz zastosować je wszystkie kolejno za pomocą:
W takim przypadku łańcuch metod może być bardziej czytelny. Ale czasami nie jest to możliwe, a tego rodzaju kompozycja może być bardziej czytelna i łatwiejsza w utrzymaniu niż
f1(f2(f3(f4(x))))
rodzaj składni.źródło
Możesz zamienić na
value = json_obj['a']['b']['c']['d']['e']
:Jeśli masz już ścieżkę
a/b/c/..
w postaci listy. Na przykład Zmień wartości w dyktach zagnieżdżonych poleceń przy użyciu elementów na liście .źródło
@Blair Conrad: Możesz także zaimplementować swoją glob / redukuj używając sum, na przykład:
Jest to mniej rozwlekłe niż którykolwiek z twoich dwóch przykładów, jest doskonale Pythonowe i nadal zawiera tylko jedną linię kodu.
Odpowiadając na pierwotne pytanie, osobiście staram się unikać korzystania z funkcji redukuj, ponieważ nigdy nie jest to konieczne i uważam, że jest to mniej jasne niż inne podejścia. Jednak niektórzy ludzie przyzwyczaili się do redukcji i wolą listy składanych (szczególnie programiści Haskell). Ale jeśli jeszcze nie myślisz o problemie związanym z redukcją, prawdopodobnie nie musisz się martwić o jego użycie.
źródło
sum
ireduce
prowadzą do zachowania kwadratowego. Można to zrobić w czasie liniowym:files = chain.from_iterable(imap(iglob, args))
. Chociaż prawdopodobnie nie ma to znaczenia w tym przypadku, ponieważ glob () potrzebuje czasu, aby uzyskać dostęp do dysku.reduce
może służyć do obsługi wyszukiwania połączonych atrybutów:Oczywiście jest to równoważne z
ale jest to przydatne, gdy kod musi akceptować dowolną listę atrybutów.
(Połączone atrybuty o dowolnej długości są powszechne w przypadku modeli Django).
źródło
reduce
jest przydatna, gdy trzeba znaleźć sumę lub częśćset
wspólną sekwencji podobnych obiektów.(Oprócz rzeczywistych
set
s, przykładem są obiekty Q Django ).Z drugiej strony, jeśli masz do czynienia z
bool
s, powinieneś użyćany
iall
:źródło
Po grepowaniu kodu wydaje się, że jedyną rzeczą, do której użyłem redukcji, jest obliczenie silni:
źródło
Piszę funkcję redagowania dla języka, więc konstruuję funkcję skomponowaną za pomocą redukuj wraz z moim operatorem stosowania.
W skrócie, funkcja Compose pobiera listę funkcji do utworzenia w jedną funkcję. Jeśli mam złożoną operację, która jest wykonywana etapami, chcę to wszystko złożyć w następujący sposób:
W ten sposób mogę następnie zastosować to do wyrażenia takiego:
Chcę, aby było to równoważne z:
Teraz, aby zbudować moje wewnętrzne obiekty, chcę powiedzieć:
(Klasa Lambda buduje funkcję zdefiniowaną przez użytkownika, a Apply buduje aplikację funkcji).
Teraz zmniejsz niestety fałdy w niewłaściwy sposób, więc skończyło się na użyciu z grubsza:
Aby dowiedzieć się, co redukuje produkuje, wypróbuj te w REPL:
źródło
compose = lambda *func: lambda arg: reduce(lambda x, f: f(x), reversed(funcs), arg)
do generowania wszystkich możliwych kombinacji funkcji do testowania wydajności.Redukcja może być użyta do uzyskania listy z maksymalnym n-tym elementem
zwróci [5, 2, 5, 7], ponieważ jest to lista z maksymalnie trzecim elementem +
źródło
Zmniejsz nie ogranicza się do operacji skalarnych; może być również używany do sortowania rzeczy do wiader. (Do tego najczęściej używam redukuj).
Wyobraź sobie przypadek, w którym masz listę obiektów i chcesz uporządkować ją hierarchicznie na podstawie właściwości przechowywanych płasko w obiekcie. W poniższym przykładzie tworzę listę obiektów metadanych związanych z artykułami w gazecie zakodowanej w formacie XML z
articles
funkcją.articles
generuje listę elementów XML, a następnie odwzorowuje je jeden po drugim, tworząc obiekty zawierające interesujące informacje na ich temat. W pierwszej kolejności chcę pozwolić użytkownikowi przeglądać artykuły według sekcji / podsekcji / nagłówka. Dlatego używamreduce
listy artykułów i zwracam pojedynczy słownik, który odzwierciedla hierarchię sekcji / podsekcji / artykułów.Podaję tutaj obie funkcje, ponieważ myślę, że pokazuje, jak mapowanie i redukcja mogą ładnie się uzupełniać w przypadku obiektów. To samo można by było osiągnąć za pomocą pętli for, ale spędzanie trochę czasu z językiem funkcjonalnym skłaniało mnie do myślenia w kategoriach mapy i redukcji.
Nawiasem mówiąc, jeśli ktoś ma lepszy sposób ustawiania właściwości, jak ja, w
extract
przypadku gdy rodzice nieruchomości, którą chcesz ustawić, mogą jeszcze nie istnieć, daj mi znać.źródło
Nie jestem pewien, czy tego szukasz, ale możesz wyszukiwać kod źródłowy w Google .
Skorzystaj z linku do wyszukiwania „function: zredukuj () lang: python” w wyszukiwarce Google Code
Na pierwszy rzut oka poniższe projekty wykorzystują
reduce()
itd. itd., ale nie jest to wcale zaskakujące, ponieważ są to ogromne projekty.
Funkcjonalność redukcji można wykonać za pomocą rekurencji funkcji, co, jak sądzę, Guido uważał za bardziej wyraźne.
Aktualizacja:
Ponieważ wyszukiwanie kodu Google zostało przerwane 15 stycznia 2012 r., Oprócz powrotu do zwykłych wyszukiwań w Google, istnieje coś, co nazywa się kolekcją fragmentów kodu, co wygląda obiecująco. Szereg innych zasobów jest wymienionych w odpowiedziach na to (zamknięte) pytanie Zastąpienie Google Code Search? .
Aktualizacja 2 (29 maja 2017):
Dobrym źródłem przykładów Pythona (w kodzie open source) jest wyszukiwarka Nullege .
źródło
for
pętli.lang:python "reduce("
spowoduje znalezienie definicjireduce
zależności od stylu kodowania kodu źródłowego.źródło
źródło
Kiedyś
reduce
konkatenowałem listę wektorów wyszukiwania PostgreSQL z||
operatorem w sqlalchemy-searchable:źródło
Mam starą implementację pipegrep w Pythonie, która używa reduktora i modułu glob do tworzenia listy plików do przetworzenia:
Wydawało mi się wtedy przydatne, ale naprawdę nie jest to konieczne, ponieważ coś podobnego jest równie dobre i prawdopodobnie bardziej czytelne
źródło
files = [glob.glob(f) for f in args]
itertools
, korzystając zflatten()
przepisu z docs.python.org/library/itertools.html , a następnie napisać:files = flatten(glob.glob(f) for f in args)
(I tym razem przetestowałem kod przed wysłaniem i wiem, że działa poprawnie.)files = chain.from_iterable(imap(iglob, args))
gdziechain
,imap
pochodzą zitertools
modułu iglob.iglob
jest przydatne, jeśli wzorzec zargs
może dawać pliki z kilku katalogów.Powiedzmy, że istnieje kilka rocznych danych statystycznych przechowywanych na liście Liczników. Chcemy znaleźć wartości MIN / MAX w każdym miesiącu w różnych latach. Na przykład w styczniu będzie to 10. A w lutym będzie to 15. Musimy przechowywać wyniki w nowym liczniku.
źródło
Mam obiekty reprezentujące pewnego rodzaju nakładające się interwały (egzony genomowe) i przedefiniowałem ich przecięcie za pomocą
__and__
:Następnie, kiedy mam ich kolekcję (na przykład w tym samym genie), używam
źródło
Właśnie znalazłem przydatne użycie
reduce
: dzielenie ciągu bez usuwania ogranicznika . Kod w całości pochodzi z bloga Programatically Speaking. Oto kod:Oto wynik:
Zauważ, że obsługuje skrajne przypadki, których popularna odpowiedź w SO nie. Aby uzyskać bardziej szczegółowe wyjaśnienia, przekierowuję do oryginalnego wpisu na blogu.
źródło
Korzystanie z redukuj (), aby sprawdzić, czy lista dat jest następująca po sobie:
źródło