두 범위 함수 결과 연결
범위 기능이 연결을 허용합니까? 마치 내가 만들고 싶은 것처럼.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
'source' 카테고리의 다른 글
Xcode에서 코드 들여쓰기 수정 (0) | 2023.05.02 |
---|---|
목록의 각 사전에 요소 추가(목록 이해) (0) | 2023.05.02 |
Bash의 멀티스레딩 (0) | 2023.05.02 |
MongoDB에서 날짜를 저장하는 가장 좋은 방법은 무엇입니까? (0) | 2023.05.02 |
유형 또는 네임스페이스 이름이 없습니다. (0) | 2023.05.02 |