reduct()를 사용하는 유용한 코드는?
여기 있는 사람 중에 파이썬에서 축소() 함수를 사용하는 유용한 코드를 가진 사람이 있습니까?예제에서 볼 수 있는 일반적인 +와 * 이외의 코드가 있습니까?
GvR에 의한 Python 3000의 감소()의 운명 참조.
* 제가 . 은 +와 * 외 * 에또찾내은다및있용른만/다있는었지니습우는이, 리제는도가있▁+▁the다습니▁i▁have또▁*우와▁uses,▁we리▁but▁besides이.any
그리고.all
그 사건들을 대체하기 위해.
foldl
그리고.foldr
스킴에 자주 등장합니다...
다음은 귀여운 사용법입니다.
목록 평탄화
턴 표: 회전[[1, 2, 3], [4, 5], [6, 7, 8]]
안으로[1, 2, 3, 4, 5, 6, 7, 8]
.
reduce(list.__add__, [[1, 2, 3], [4, 5], [6, 7, 8]], [])
숫자부터 숫자까지의 숫자 목록
턴 표: 회전[1, 2, 3, 4, 5, 6, 7, 8]
안으로12345678
.
추악하고 느린 방법:
int("".join(map(str, [1,2,3,4,5,6,7,8])))
ㅠㅠㅠreduce
예:예:
reduce(lambda a,d: 10*a+d, [1,2,3,4,5,6,7,8], 0)
reduce()
3개 이상의 숫자에 대한 최소 공배수를 찾는 데 사용할 수 있습니다.
#!/usr/bin/env python
from math import gcd
from functools import reduce
def lcm(*args):
return reduce(lambda a,b: a * b // gcd(a, b), args)
예:
>>> lcm(100, 23, 98)
112700
>>> lcm(*range(1, 20))
232792560
reduce()
점으로 표시된 이름을 확인하는 데 사용할 수 있습니다(여기서)eval()
안전하지 않아 사용할 수 없음):
>>> import __main__
>>> reduce(getattr, "os.path.abspath".split('.'), __main__)
<function abspath at 0x009AB530>
지정된 목록 N개의 교차점 찾기:
input_list = [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7]]
result = reduce(set.intersection, map(set, input_list))
반환:
result = set([3, 4, 5])
경유: Python - 두 목록의 교차점
축소는 어리석은 명령이라고 생각합니다.따라서:
reduce(lambda hold,next:hold+chr(((ord(next.upper())-65)+13)%26+65),'znlorabggbbhfrshy','')
의 reduce
내 코드에서 찾은 것은 논리 표현을 위한 클래스 구조를 가지고 있는 상황과 관련이 있고 나는 이러한 표현 객체의 목록을 표현의 결합으로 변환해야 했습니다. 나는이미기있었다니습이 기능을 가지고 .make_and
두 개의 표현식이 주어진 접속사를 만들기 위해, 그래서 저는 썼습니다.reduce(make_and,l)
(목록이 비어있지 않다는 것을 알았습니다; 그렇지 않았다면 그것은 다음과 같은 것이었을 것입니다.reduce(make_and,l,make_true)
.)
이것이 바로 (일부) 기능 프로그래머들이 좋아하는 이유입니다.reduce
(또는 일반적으로 이러한 기능을 호출하는 접기 기능).다음과 같은 많은 이진 함수가 이미 있습니다.+
,*
,min
,max
및연과경, 제에는우결는에▁conc,경.make_and
그리고.make_or
가지고 있는 것.reduce
에서는 이러한 작업을 목록(또는 트리 또는 사용자가 얻은 모든 항목)으로 끌어올리는 것이 일반적으로 단순해집니다.
물론, 특정 인스턴스(예:sum
사용되는데, 계속 것입니다. 그러면 계속 쓰고 싶지 않을 것입니다.reduce
를 하는 대신에, 는대하에신의정▁however대에신▁the.sum
일부 for-loop으로, 당신은 그것을 쉽게 정의할 수 있습니다.reduce
.
다른 사람들이 언급한 것처럼 가독성은 실제로 문제입니다.하지만, 당신은 주장할 수 있습니다, 사람들이 발견하는 유일한 이유는reduce
많은 사람들이 알고 있거나 사용하는 기능이 아니기 때문입니다.
함수 구성:다음과 같은 연속적으로 적용할 기능 목록이 이미 있는 경우:
color = lambda x: x.replace('brown', 'blue')
speed = lambda x: x.replace('quick', 'slow')
work = lambda x: x.replace('lazy', 'industrious')
fs = [str.lower, color, speed, work, str.title]
그런 다음 다음을 사용하여 모든 항목을 연속적으로 적용할 수 있습니다.
>>> call = lambda s, func: func(s)
>>> s = "The Quick Brown Fox Jumps Over the Lazy Dog"
>>> reduce(call, fs, s)
'The Slow Blue Fox Jumps Over The Industrious Dog'
이 경우 메서드 체인을 더 쉽게 읽을 수 있습니다.하지만 때때로 그것은 불가능하고, 이런 종류의 구성은 아마도 더 읽기 쉽고 유지 가능할 것입니다.f1(f2(f3(f4(x))))
구문의 종류
대체할 수 있습니다.value = json_obj['a']['b']['c']['d']['e']
매개 변수:
value = reduce(dict.__getitem__, 'abcde', json_obj)
이미 경로가 있는 경우a/b/c/..
일람표로서예를 들어 목록의 항목을 사용하여 중첩된 딕트의 딕트 값을 변경합니다.
@블레어 콘래드:또한 다음과 같은 합계를 사용하여 글로벌/디덕션을 구현할 수 있습니다.
files = sum([glob.glob(f) for f in args], [])
이것은 당신의 두 예시 중 어느 것보다 덜 장황하고, 완벽하게 파이썬적이며, 여전히 코드 한 줄에 불과합니다.
그래서 원래 질문에 답하기 위해 저는 개인적으로 환원을 사용하는 것을 피하려고 노력합니다. 왜냐하면 그것은 결코 실제로 필요하지 않고 다른 접근법보다 덜 명확하기 때문입니다.그러나 일부 사람들은 이해를 줄이는 데 익숙해지고 목록을 작성하는 것보다 선호하게 됩니다(특히 해스켈 프로그래머).그러나 문제를 줄이기 위해 이미 생각하고 있지 않다면 사용에 대해 걱정할 필요가 없을 것입니다.
reduce
연결된 특성 조회를 지원하는 데 사용할 수 있습니다.
reduce(getattr, ('request', 'user', 'email'), self)
물론, 이것은 다음과 같습니다.
self.request.user.email
그러나 코드가 임의의 속성 목록을 허용해야 할 때 유용합니다.
(임의 길이의 체인 속성은 Django 모델을 다룰 때 일반적입니다.)
reduce
일련의 결합 또는 교차점을 찾아야 할 때 유용합니다.set
-물건과 같은 것.
>>> reduce(operator.or_, ({1}, {1, 2}, {1, 3})) # union
{1, 2, 3}
>>> reduce(operator.and_, ({1}, {1, 2}, {1, 3})) # intersection
{1}
로)set
s, 이것들의 예는 장고의 Q 객체들입니다.)
반면에, 당신이 상대하고 있다면,bool
s, 당신은 사용해야 합니다.any
그리고.all
:
>>> any((True, False, True))
True
저는 언어에 대한 작성 기능을 작성하고 있기 때문에 적용 연산자와 함께 축소를 사용하여 작성 기능을 구성합니다.
간단히 말해서, 컴포지트는 단일 함수로 구성할 함수 목록을 사용합니다.단계적으로 적용되는 복잡한 작업을 수행할 경우 다음과 같이 모든 작업을 통합하고 싶습니다.
complexop = compose(stage4, stage3, stage2, stage1)
이런 식으로 다음과 같은 식에 적용할 수 있습니다.
complexop(expression)
그리고 저는 그것이 다음과 같길 원합니다.
stage4(stage3(stage2(stage1(expression))))
이제, 제 내부 객체를 구축하기 위해, 저는 다음과 같이 말하고 싶습니다.
Lambda([Symbol('x')], Apply(stage4, Apply(stage3, Apply(stage2, Apply(stage1, Symbol('x'))))))
(Lambda 클래스는 사용자 정의 함수를 작성하고 Apply는 함수 응용 프로그램을 작성합니다.)
자, 불행하게도, 잘못된 방법으로 접히는 것을 줄이세요. 그래서 저는 대충 다음과 같이 사용하게 되었습니다.
reduce(lambda x,y: Apply(y, x), reversed(args + [Symbol('x')]))
감소가 어떤 결과를 낳는지 알아보려면 REPL에서 다음을 시도하십시오.
reduce(lambda x, y: (x, y), range(1, 11))
reduce(lambda x, y: (y, x), reversed(range(1, 11)))
최대 n번째 요소를 가진 목록을 얻는 데 사용할 수 있습니다.
reduce(lambda x,y: x if x[2] > y[2] else y,[[1,2,3,4],[5,2,5,7],[1,6,0,2]])
[5, 2, 5, 7]을 최대 3번째 요소 +가 있는 목록으로 반환합니다.
축소는 스칼라 연산에 국한되지 않으며 버킷으로 정렬하는 데도 사용할 수 있습니다.(이것이 제가 가장 자주 사용하는 감소입니다.)
개체 목록이 있고 개체에 평평하게 저장된 속성을 기반으로 계층적으로 다시 구성하려는 경우를 상상해 보십시오. 파일에 포함하여 합니다.articles
기능.articles
에서는 XML 요소의 목록을 생성한 다음 이 요소를 하나씩 매핑하여 해당 요소에 대한 흥미로운 정보를 포함하는 개체를 생성합니다.프런트 엔드에서는 사용자가 섹션/하위 섹션/헤드라인별로 기사를 검색할 수 있도록 합니다.그래서 사용합니다.reduce
문서 목록을 가져오고 섹션/하위 섹션/기사 계층 구조를 반영하는 단일 사전을 반환합니다.
from lxml import etree
from Reader import Reader
class IssueReader(Reader):
def articles(self):
arts = self.q('//div3') # inherited ... runs an xpath query against the issue
subsection = etree.XPath('./ancestor::div2/@type')
section = etree.XPath('./ancestor::div1/@type')
header_text = etree.XPath('./head//text()')
return map(lambda art: {
'text_id': self.id,
'path': self.getpath(art)[0],
'subsection': (subsection(art)[0] or '[none]'),
'section': (section(art)[0] or '[none]'),
'headline': (''.join(header_text(art)) or '[none]')
}, arts)
def by_section(self):
arts = self.articles()
def extract(acc, art): # acc for accumulator
section = acc.get(art['section'], False)
if section:
subsection = acc.get(art['subsection'], False)
if subsection:
subsection.append(art)
else:
section[art['subsection']] = [art]
else:
acc[art['section']] = {art['subsection']: [art]}
return acc
return reduce(extract, arts, {})
제가 여기에 두 가지 기능을 제공하는 이유는 맵과 리덕션이 객체를 다룰 때 어떻게 서로를 잘 보완할 수 있는지를 보여준다고 생각하기 때문입니다.같은 일이 for 루프에서 이루어졌을 수도 있지만... 기능적인 언어와 함께 진지한 시간을 보내는 것은 지도의 측면에서 생각하게 하고 감소시키는 경향이 있습니다.
그건 그렇고, 내가 하는 것처럼 부동산을 설정할 수 있는 더 좋은 방법이 있는 사람이 있다면요.extract
설정하고자 하는 부동산의 부모님이 아직 존재하지 않을 수도 있는 곳을 알려주십시오.
이것이 당신이 원하는 것인지 확실하지 않지만 당신은 구글에서 소스 코드를 검색할 수 있습니다.
Google 코드 검색에서 'function:reduce() lang:python'에 대한 검색 링크를 클릭합니다.
에 다음 는 언뜻보다프다같습니다음과는트로젝을 합니다.reduce()
- 모인모인
- 조페
- 숫자
- 사이언티픽 파이썬
기타 등등 하지만 이것들은 큰 프로젝트이기 때문에 놀라운 일은 아닙니다.
축소의 기능은 Guido가 더 명확하다고 생각한 함수 재귀를 사용하여 수행할 수 있습니다.
업데이트:
구글의 코드 검색이 2012년 1월 15일에 중단되었기 때문에, 일반적인 구글 검색으로 돌아가는 것 외에, 유망해 보이는 코드 스니펫 모음이라는 것이 있습니다.Google 코드 검색을 위한 교체?라는 질문에 대한 답변에 다른 많은 리소스가 언급되어 있습니다.
업데이트 2(2017년 5월 29일):
Python 예제(오픈 소스 코드)의 좋은 소스는 Nullege 검색 엔진입니다.
코드를 grep한 후에 축소를 사용한 것은 요인 계산뿐인 것 같습니다.
reduce(operator.mul, xrange(1, x+1) or (1,))
import os
files = [
# full filenames
"var/log/apache/errors.log",
"home/kane/images/avatars/crusader.png",
"home/jane/documents/diary.txt",
"home/kane/images/selfie.jpg",
"var/log/abc.txt",
"home/kane/.vimrc",
"home/kane/images/avatars/paladin.png",
]
# unfolding of plain filiname list to file-tree
fs_tree = ({}, # dict of folders
[]) # list of files
for full_name in files:
path, fn = os.path.split(full_name)
reduce(
# this fucction walks deep into path
# and creates placeholders for subfolders
lambda d, k: d[0].setdefault(k, # walk deep
({}, [])), # or create subfolder storage
path.split(os.path.sep),
fs_tree
)[1].append(fn)
print fs_tree
#({'home': (
# {'jane': (
# {'documents': (
# {},
# ['diary.txt']
# )},
# []
# ),
# 'kane': (
# {'images': (
# {'avatars': (
# {},
# ['crusader.png',
# 'paladin.png']
# )},
# ['selfie.jpg']
# )},
# ['.vimrc']
# )},
# []
# ),
# 'var': (
# {'log': (
# {'apache': (
# {},
# ['errors.log']
# )},
# ['abc.txt']
# )},
# [])
#},
#[])
의유한사발을다니습견했용법용▁▁of다▁found니의 유용한 사용법을 발견했습니다.reduce
구분 기호를 제거하지 않고 문자열을 분할합니다.코드는 전적으로 프로그래밍 언어 블로그에서 가져온 것입니다.코드는 다음과 같습니다.
reduce(lambda acc, elem: acc[:-1] + [acc[-1] + elem] if elem == "\n" else acc + [elem], re.split("(\n)", "a\nb\nc\n"), [])
결과는 다음과 같습니다.
['a\n', 'b\n', 'c\n', '']
SO에서 인기 있는 답변이 처리하지 않는 에지 사례를 처리합니다.더 자세한 설명을 위해, 원래 블로그 게시물로 당신을 리디렉션합니다.
저는 용한사를 요.reduce
Postgre 목록을 연결합니다.를 사용한 SQL 검색 벡터||
sqlalchemy-searchable의 는 다음과 같습니다.
vectors = (self.column_vector(getattr(self.table.c, column_name))
for column_name in self.indexed_columns)
concatenated = reduce(lambda x, y: x.op('||')(y), vectors)
compiled = concatenated.compile(self.conn)
저는 축소 및 글로벌 모듈을 사용하여 처리할 파일 목록을 만드는 오래된 Pipegrep 구현을 가지고 있습니다.
files = []
files.extend(reduce(lambda x, y: x + y, map(glob.glob, args)))
저는 그 당시에 그것이 편리하다는 것을 알았지만, 그것은 정말로 필요하지 않습니다. 비슷한 것이 그만큼 좋고 아마도 더 읽기 쉽기 때문입니다.
files = []
for f in args:
files.extend(glob.glob(f))
카운터 목록이 저장된 몇 가지 연간 통계 데이터가 있다고 가정해 보겠습니다.여러 해에 걸쳐 매월 최소/최대 값을 찾으려고 합니다.예를 들어, 1월의 경우에는 10입니다.그리고 2월에는 15세가 될 것입니다.결과를 새 카운터에 저장해야 합니다.
from collections import Counter
stat2011 = Counter({"January": 12, "February": 20, "March": 50, "April": 70, "May": 15,
"June": 35, "July": 30, "August": 15, "September": 20, "October": 60,
"November": 13, "December": 50})
stat2012 = Counter({"January": 36, "February": 15, "March": 50, "April": 10, "May": 90,
"June": 25, "July": 35, "August": 15, "September": 20, "October": 30,
"November": 10, "December": 25})
stat2013 = Counter({"January": 10, "February": 60, "March": 90, "April": 10, "May": 80,
"June": 50, "July": 30, "August": 15, "September": 20, "October": 75,
"November": 60, "December": 15})
stat_list = [stat2011, stat2012, stat2013]
print reduce(lambda x, y: x & y, stat_list) # MIN
print reduce(lambda x, y: x | y, stat_list) # MAX
는 어떤 간격(엑손)을 나타내는 개체를 , 나는어떤유중을간첩격(게놈 엑손)을 하여 그들의 교차를 재정의했습니다.__and__
:
class Exon:
def __init__(self):
...
def __and__(self,other):
...
length = self.length + other.length # (e.g.)
return self.__class__(...length,...)
그런 다음 (예를 들어, 같은 유전자에서) 그것들의 컬렉션이 있을 때, 저는 사용합니다.
intersection = reduce(lambda x,y: x&y, exons)
def dump(fname,iterable):
with open(fname,'w') as f:
reduce(lambda x, y: f.write(unicode(y,'utf-8')), iterable)
축소()를 사용하여 날짜 목록이 연속적인지 확인합니다.
from datetime import date, timedelta
def checked(d1, d2):
"""
We assume the date list is sorted.
If d2 & d1 are different by 1, everything up to d2 is consecutive, so d2
can advance to the next reduction.
If d2 & d1 are not different by 1, returning d1 - 1 for the next reduction
will guarantee the result produced by reduce() to be something other than
the last date in the sorted date list.
Definition 1: 1/1/14, 1/2/14, 1/2/14, 1/3/14 is consider consecutive
Definition 2: 1/1/14, 1/2/14, 1/2/14, 1/3/14 is consider not consecutive
"""
#if (d2 - d1).days == 1 or (d2 - d1).days == 0: # for Definition 1
if (d2 - d1).days == 1: # for Definition 2
return d2
else:
return d1 + timedelta(days=-1)
# datelist = [date(2014, 1, 1), date(2014, 1, 3),
# date(2013, 12, 31), date(2013, 12, 30)]
# datelist = [date(2014, 2, 19), date(2014, 2, 19), date(2014, 2, 20),
# date(2014, 2, 21), date(2014, 2, 22)]
datelist = [date(2014, 2, 19), date(2014, 2, 21),
date(2014, 2, 22), date(2014, 2, 20)]
datelist.sort()
if datelist[-1] == reduce(checked, datelist):
print "dates are consecutive"
else:
print "dates are not consecutive"
언급URL : https://stackoverflow.com/questions/15995/useful-code-which-uses-reduce
'programing' 카테고리의 다른 글
저장 프로시저가 있는지 확인하는 방법은 무엇입니까? (0) | 2023.08.29 |
---|---|
'System'의 형식 이니셜라이저입니다.데이터. 엔티티.내부의.AppConfig'에서 예외를 발생시켰습니다. (0) | 2023.08.29 |
Ajax 요청은 쿠키 전송이 보장됩니까? (0) | 2023.08.29 |
VS Code를 사용하여 Github에 새 프로젝트를 추가하는 방법 (0) | 2023.08.29 |
자바스크립트에 정의되기 전에 함수를 사용할 수 있는 이유는 무엇입니까? (0) | 2023.08.29 |