파이썬 3 회전 범위를 목록으로


178

숫자 1-1000가 있는 목록을 만들려고 합니다. 분명히 이것은 쓰기 / 읽기를 귀찮게 할 것이므로 범위가있는 목록을 만들려고합니다. 파이썬 2에서는 다음과 같습니다.

some_list = range(1,1000)

작동했지만 Python 3에서는 범위가 xrangePython 2 와 비슷 합니까?

누구든지 이것에 대한 통찰력을 제공 할 수 있습니까?


1
또한, some_list[i] == i+1어쨌든 실제로 목록이 필요하지 않을 수도 있습니다.
njzk2 2016

1
@RikPoggi. 예를 들어, 플로팅 기능에 대한 목록을 제공해야 할 수 있습니다. 때로는 범위가 충분하지만 범위를 연결할 수 없으므로 변경할 수 없으므로 플롯되는 모든 목록에 기본 시작 값을 추가해야하는 경우 해당 목록도 목록으로 설정해야합니다.
SherylHohman

답변:


223

range 객체에서 목록을 만들 수 있습니다.

my_list = list(range(1, 1001))

이것은 python2.x의 생성기로도 수행하는 방법입니다. my_list[i]더 효율적으로 가치를 얻을 수 있기 때문에 일반적으로 목록이 필요하지는 않지만 ( i + 1) 반복해야 할 경우 다시 넘어갈 수 있습니다 range.

또한 python2.x에서는 xrange여전히 색인 가능 1 입니다. 이것은 rangepython3.x에서 동일한 속성 2를 가지고 있음을 의미합니다

1print xrange(30)[12] 은 python2.x에서 작동합니다.

2 python3.x 에서 1 과 유사한 문 print(range(30)[12])은 작동합니다.


4
이것은 확실히가는 길이지만, nitpick : 이것은 실제로 "캐스트"가 아닙니다
jterrace

@jterrace가 "cast"를 "convert"로 변경했습니다. 캐스트되지 않은 것에 대해 당신은 옳습니다 ... 나는 그것을 정확히 무엇이라고 부를 지 모르겠습니다.
mgilson

2
"construct"또는 "build"(또는 가능하면 "materialise")라고 말할 것입니다. 생성기를 목록으로 "변환"하지 않기 때문에 데이터 소스에서 새로운 목록 객체를 생성합니다. 발전기가 되려면 ... (그러나 머리카락을 쪼개고 100 % 확실하지 않은 경우)
Jon Clements

2
다른 OO 언어와 일치하므로 "구문"에 대한 내 +1 는 list(arg)의 생성자 호출로 다른 언어로 이해된다 list클래스를. 실제로, 그것은 또한 파이썬 사례입니다. 생성하는 동안 (C ++의 경우와 같이) 객체가 채워지는지 또는 첫 번째 자동 호출 된 메소드 (파이썬의 경우와 같은 경우)만이 __init__()기본 추상 아이디어를 변경할 수 없는지에 대한 토론 . 내 견해로는 목록 생성자가 반복자를 가져 와서 반환 된 값으로 목록을 채 웁니다 .
pepr

2
jupyter 노트북에서 오류가 발생하고 쉘에서 정상적으로 작동하는 이유는 무엇입니까? 오류 :'range' object is not callable
subtleseeker

34

파이썬 <= 3.4에서는 다른 사람들이 제안한 것처럼 list(range(10))목록을 범위 (일반적으로 반복 가능)에서 벗어나게 만들기 위해 사용할 수 있습니다 .

3.5압축 풀기 일반화와 함께 Python에 도입 된 또 다른 대안 *은 목록 리터럴 을 사용 하는 것입니다 [].

>>> r = range(10)
>>> l = [*r]
>>> print(l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

이것은와 동일하지만 list(r)리터럴 구문이며 함수 호출이 포함되어 있지 않기 때문에 더 빠르게 실행할 수 있습니다. 골프를 코딩 해야하는 경우 문자가 적습니다. :-)


4
분명히, 당신은 여전히 ​​한 줄로 할 수 있습니다 : 어떤 목적을 위해 [*range(10)]필요 range하지 않지만를 초기화하는 경우에만 잘 작동 합니다 list. 참고 사항 : 압축 풀기 일반화에서 가장 좋아하는 부분은 빈 set에는 이제 문자 구문이 {*()}있거나 외눈 원숭이 연산자라고 부르는 것입니다. ;-)
ShadowRanger 2018

@ShadowRanger 그것이 처음에 글을 쓰는 것에 대한 생각입니다. 나는 :-) 혼동 새로운 것이 아니다 파이썬 사용자를 위해 더 자세한 조금로 결정
디미트리 Fasarakis 힐리

26

Python 3.x에서는 range()함수 자체 유형이 있습니다. 따라서이 경우 반복자를 사용해야합니다

list(range(1000))


11
"이 경우 반복자를 사용해야합니다"? 도대체 무슨 뜻입니까?
user2357112는

2
파이썬 3.7을 사용하고 x = list (range (1000))을 시도했지만 TypeError : 'list'개체를 호출 할 수 없습니다.
Earthshaker

@Earthshaker 다음과 같은 오타가 있어야합니다.list(range(1000))()
wjandrea

17

Python3에 범위가 지정된 목록을 직접 가져 오는 기능이없는 이유는 원래 Python3 디자이너가 Python2의 초보자이기 때문입니다. 그는 range()for 루프에서 함수 의 사용만을 고려 했으므로 목록을 확장 할 필요가 없습니다. 실제로, 종종 range()리스트를 생성 하고 함수에 전달하기 위해 함수를 사용해야합니다 .

따라서이 경우 Python3에 비해 Python3이 덜 편리합니다.

  • Python2에서 우리는 xrange()range();
  • Python3에서, 우리가 range()하고list(range())

그럼에도 불구하고 여전히 다음과 같은 방법으로 목록 확장을 사용할 수 있습니다.

[*range(N)]

3
전체 요점은 덜 편리를 할 수 있도록하는 것입니다 list그것이 할 수있는 잘못된 일이 보통이기 때문에. 99 (100) 중 사용 사례를 들어, 실제 만들기 list때문에, 비효율적이고 무의미 range자체가 부팅 때로는 더 효율적으로, 거의 모든면에서 불변의 순서와 같은 역할 (예 : 봉쇄 시험 int의는 O(1), 대 O(n)를위한 lists) 등이 있습니다. 파이썬 2에서는 사람들이 range기본적 으로 사용 하는 경향이 있지만 xrange거의 항상 더 나은 옵션이었습니다. Python 3에서는 list실수로 잘못된 이름을 사용하여 얻지 않고을 명시 적으로 선택할 수 있습니다 .
ShadowRanger 2016 년

7
Python 3 디자이너와 Python 2에 대한 전문 지식에 대한 의견은 대담하고 무례합니다.
kazarey

@kazarey 그러나 사실입니까? 파이썬에는이 라인을 따라 의심스러운 것들이 많이 있습니다
javadba

1
특히 압축 풀기 속기는 목록을 구성하는 데 찬성하지만 @kazarey에 동의합니다. 디자이너에 대한 의견은 근거가 없거나 (적어도 참조에 의해 뒷받침되지 않음) 불필요합니다.
Nubarke

12

실제로 목록에서 숫자 1-1000을 사용할 필요는 없습니다. 그러나 어떤 이유로 든이 숫자가 실제로 필요한 경우 다음을 수행 할 수 있습니다.

[i for i in range(1, 1001)]

간단히 말하면 이해력을 나열하십시오.

위의 목록 이해는 다음과 같이 번역됩니다.

nums = []
for i in range(1, 1001):
    nums.append(i)

이것은 2.x부터의 목록 이해 구문 일뿐입니다. 파이썬 3에서 작동한다는 것을 알고 있지만 업그레이드 된 구문이 있는지 확실하지 않습니다.

범위는 첫 번째 매개 변수를 포함하여 시작합니다. 두 번째 매개 변수를 포함하지 않고 위로 끝납니다 (2 매개 변수를 제공 할 때; 첫 번째 매개 변수가 꺼져 있으면 '0'에서 시작합니다)

range(start, end+1)
[start, start+1, .., end]

20
왜 이해해야합니까? 그냥 :list(range(1000))
릭 지오 포기

감사! 왜 내가 i 대신 내가 i ...인지 설명해 주시겠습니까?
보트 하우스

나는 python3으로 일하지 않았습니다. 그래서 그것이 어떻게 작동하는지 완전히 확신하지 못합니다. 나는 이해가 효과가 있지만 캐스팅에 100 %는 아니라는 것을 알고 있습니다. 그러나 캐스팅이 작동하면 옳고 자신의 길은 더 비 오닉 적입니다.
inspectorG4dget

1
@ inspectorG4dget : "캐스팅"이 아니며 list()iterable로 생성자를 호출합니다 . list()생성자는 반복자 객체를 주어진 경우 새 목록을 만드는 방법을 알고있다.
Greg Hewgill

4
@ inspectorG4dget : python2에서 list(range(1000))와 같이 python3에서도 작동합니다list(xrange(1000))
Rik Poggi

4

실제로 1-1000 (포함)을 원하는 경우 함수가 시작에서 (end-1) (포함)로 진행 되므로 range(...)매개 변수 1 및 1001 :과 함께 함수를 사용하십시오 .range(1, 1001)range(start, end)


0

파이썬 3에서 범위 를 사용하십시오 .

다음은 두 숫자에서 숫자 사이를 반환하는 함수 예제입니다.

def get_between_numbers(a, b):
    """
    This function will return in between numbers from two numbers.
    :param a:
    :param b:
    :return:
    """
    x = []
    if b < a:
        x.extend(range(b, a))
        x.append(a)
    else:
        x.extend(range(a, b))
        x.append(b)

    return x

결과

print(get_between_numbers(5, 9))
print(get_between_numbers(9, 5))

[5, 6, 7, 8, 9]  
[5, 6, 7, 8, 9]

이것은 다른 질문에 대답하는 것 같습니다 ...?
wjandrea

-1

실제로 이것은 Python2와 비교하여 Python3의 역행입니다. 확실히, range ()와 xrange ()를 사용하는 Python2는 각각 list (range ())와 range ()를 사용하는 Python3보다 편리합니다. 그 이유는 Python3의 원래 디자이너는 경험이 많지 않기 때문에 많은 초보자가 범위 함수를 사용하여 메모리와 CPU가 모두 비효율적 인 많은 요소를 반복하는 것으로 간주했습니다. 그러나 그들은 숫자리스트를 생성하기 위해 range 함수의 사용을 무시했다. 이제는 이미 변경하기에 너무 늦었습니다.

Python3의 디자이너가 되려면 다음을 수행하십시오.

  1. irange를 사용하여 시퀀스 반복자를 반환
  2. lrange를 사용하여 시퀀스 목록을 반환
  3. range를 사용하여 시퀀스 반복자를 반환합니다 (예 : range (9999999) 또는 요소 목록이 큰 경우 시퀀스 목록 (예 : range (10)))

그것은 최적이어야합니다.


이 질문에 어떻게 대답합니까?
wjandrea

예, Python3 개발자에게 Python3을 변경하고 개선하도록 요청하여 질문에 대답합니다. 그러나 그들이 우아하지 않기 때문에 그들이 변할 것 같지는 않습니다.
xuancong84
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.