본문 바로가기

개발하자

Python에서 한 번에 여러 요소를 선택하는 것을 반복합니다.

반응형

Python에서 한 번에 여러 요소를 선택하는 것을 반복합니다.

특정 길이의 조각에 대해 반복하고 싶은 목록이 있습니다. 예를 들어 다음과 같습니다.

>>> seq = 'ABCDEF'
>>> [''.join(x) for x in zip(seq, seq[1:], seq[2:])]
['ABC', 'BCD', 'CDE', 'DEF']

즉, 각 하위 시퀀스의 길이를 지정할 수 있는 단축형이 있습니까?




우아한 해결책은 아니지만 다음과 같은 효과가 있습니다.

seq = 'ABCDEF'
n=3
[seq[i:i+n] for i in range(0, len(seq)+1-n)]



유사한 것에 대한 파이썬 코드입니다.

이것의 훨씬 우아하고 추천되는 버전은 파이썬의 라이브러리를 사용하는 것이다(심각하게도, 그들은 왜 이 기능을 라이브러리에 포함시키지 않는가?

이 경우 설명서에 제공된 기능과 유사한 기능을 대신 사용할 수 있습니다.

from itertools import tee
def tripletWise(iterable):
    "s -> (s0,s1,s2), (s1,s2,s3), (s2,s3,s4), ..."
    a, b, c = tee(iterable, 3)
    next(b, None)
    next(c, None)
    next(c, None)
    return zip(a, b)

[''.join(i) for i in tripletWise('ABCDEF')]
> ['ABC', 'BCD', 'CDE', 'DEF']

또한 목록을 한 번에 선택할 요소의 개수로 청크하는 더 일반적인 함수를 만들 수 있습니다.

def nWise(iterable, n=2):
    iterableList = tee(iterable, n)
    for i in range(len(iterableList)):
        for j in range(i):
            next(iterableList[i], None)
    return zip(*iterableList)

[''.join(i) for i in nWise('ABCDEF', 4)]
> ['ABCD', 'BCDE', 'CDEF']



도구 예제에서 groupper()를 사용합니다. 구체적으로.

https://docs.python.org/3/library/itertools.html#itertools-recipes

또는 같은 페이지에서 더 많은 도구를 설치하는 것이 좋습니다. 그런 다음 또는 를 사용할 수 있습니다.

https://pypi.org/project/more-itertools/


반응형