source

두 범위 함수 결과 연결

ittop 2023. 5. 2. 23:00
반응형

두 범위 함수 결과 연결

범위 기능이 연결을 허용합니까? 마치 내가 만들고 싶은 것처럼.range(30)그것을 …과 연결시키다.range(2000, 5002)그래서 나의 연결된 범위는0, 1, 2, ... 29, 2000, 2001, ... 5001

이와 같은 코드는 내 최신 파이썬(버전: 3.3.0)에서 작동하지 않습니다.

range(30) + range(2000, 5002)

다음에 사용할 수 있습니다.

from itertools import chain
concatenated = chain(range(30), range(2000, 5002))
for i in concatenated:
     ...

임의의 반복 가능성에 대해 작동합니다.Python 2와 3 사이에는 반드시 알아야 할 동작의 차이가 있습니다. Python 2에서는 목록을 반환하고 Python 3에서는 메모리 효율적이지만 항상 바람직한 것은 아닙니다.

목록을 연결할 수 있습니다.+반복자는 할 수 없습니다.

저는 가능한 가장 간단한 솔루션(효율성 포함)을 좋아합니다.해결책이 그런 것인지 항상 명확한 것은 아닙니다.어쨌든, 그.range()Python 3에서는 생성기입니다.반복을 수행하는 모든 구성으로 래핑할 수 있습니다.list()임의의 반복 가능한 목록 값을 구성할 수 있습니다.+목록의 연산자가 연결을 수행합니다.예제에서 더 작은 값을 사용하고 있습니다.

>>> list(range(5))
[0, 1, 2, 3, 4]
>>> list(range(10, 20))
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> list(range(5)) + list(range(10,20))
[0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

이것이 무엇입니까?range(5) + range(10, 20)파이썬 2.5에서 정확히 수행했습니다 -- 왜냐하면range()목록을 반환했습니다.

Python 3에서는 목록을 구성하려는 경우에만 유용합니다.그렇지 않다면, 나는 itertools.chain이 있는 Lev Levitsky의 솔루션을 추천합니다.설명서에는 매우 간단한 구현도 나와 있습니다.

def chain(*iterables):
    # chain('ABC', 'DEF') --> A B C D E F
    for it in iterables:
        for element in it:
            yield element

인바 로즈의 솔루션은 양호하고 기능적으로 동등합니다.어쨌든, 저의 +1은 레브 레비츠키와 표준 라이브러리 사용에 대한 그의 논쟁에 관한 것입니다.파이썬의 선에서...

애매모호한 상황에서, 추측하고 싶은 유혹을 거절하세요.

#!python3
import timeit
number = 10000

t = timeit.timeit('''\
for i in itertools.chain(range(30), range(2000, 5002)):
    pass
''',
'import itertools', number=number)
print('itertools:', t/number * 1000000, 'microsec/one execution')

t = timeit.timeit('''\
for x in (i for j in (range(30), range(2000, 5002)) for i in j):
    pass
''', number=number)
print('generator expression:', t/number * 1000000, 'microsec/one execution')

제 생각에는,itertools.chain가독성이 더 높습니다.하지만 정말 중요한 건...

itertools: 264.4522138986938 microsec/one execution
generator expression: 785.3081048010291 microsec/one execution

그것은 약 3배 더 빠릅니다.

python >= 3.5

목록에서 쉽게 압축을 풀 수 있습니다(PEP 448: 추가 압축 풀기 일반화 참조).

목록이 필요하면,

[*range(2, 5), *range(3, 7)]
# [2, 3, 4, 3, 4, 5, 6]

이렇게 하면 순서가 유지되고 중복 항목은 제거되지 않습니다.아니면 튜플을 원하실 수도 있고,

(*range(2, 5), *range(3, 7))
# (2, 3, 4, 3, 4, 5, 6)

아니면 세트로.

# note that this drops duplicates
{*range(2, 5), *range(3, 7)}
# {2, 3, 4, 5, 6}

또한 전화를 거는 것보다 더 빠릅니다.itertools.chain.

from itertools import chain

%timeit list(chain(range(10000), range(5000, 20000)))
%timeit [*range(10000), *range(5000, 20000)]

738 µs ± 10.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
665 µs ± 13.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

의 이점chain그러나 임의의 범위 목록을 전달할 수 있습니다.

ranges = [range(2, 5), range(3, 7), ...]
flat = list(chain.from_iterable(ranges))

OTOH, 포장 풀기 일반화는 임의의 순서로 "일반화"되지 않았기 때문에 개별 범위를 직접 포장 풀기해야 합니다.

목록 이해를 사용하여 수행할 수 있습니다.

>>> [i for j in (range(10), range(15, 20)) for i in j]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15, 16, 17, 18, 19]

당신의 요청에 적합하지만, 답변이 길어서 여기에 올리지 않겠습니다.

참고: 성능 향상을 위해 제너레이터로 만들 수 있습니다.

for x in (i for j in (range(30), range(2000, 5002)) for i in j):
    # code

또는 발전기 변수에 포함될 수도 있습니다.

gen = (i for j in (range(30), range(2000, 5002)) for i in j)
for x in gen:
    # code

확장 방법을 사용하면 두 개의 목록을 연결할 수 있습니다.

>>> a = list(range(1,10))
>>> a.extend(range(100,105))
>>> a  
[1, 2, 3, 4, 5, 6, 7, 8, 9, 100, 101, 102, 103, 104]

range()Python 2.x에서 다음 목록을 반환합니다.

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

xrange()Python 2.x에서 다음 반복기를 반환합니다.

>>> xrange(10)
xrange(10)

그리고 파이썬 3에서는range()또한 반복기를 반환합니다.

>>> r = range(10)
>>> iterator = r.__iter__()
>>> iterator.__next__()
0
>>> iterator.__next__()
1
>>> iterator.__next__()
2

따라서 다음을 사용하여 다른 반복기를 연결할 수 없습니다.chain()다른 사람이 지적했듯이.

범위 기능 주변의 목록 기능을 사용하여 다음과 같은 목록을 만들 수 있습니다.

list(range(3,7))+list(range(2,9))

이 질문을 하게 된 이유는 중복될 수 있는 알 수 없는 범위를 연결하고 최종 반복기에서 반복되는 값을 원하지 않았기 때문입니다.은 해책다같습다니음과제은을 사용하는 것이었습니다.set연산자는 다음과 같습니다.

range1 = range(1,4)
range2 = range(2,6)
concatenated = set.union(set(range1), set(range2)
for i in concatenated:
    print(i)

언급URL : https://stackoverflow.com/questions/14099872/concatenating-two-range-function-results

반응형