1부터 시작하는 숫자 범위를 열거하는 방법


154

Python 2.5를 사용하고 있으며 열거 형을 원합니다 (0 대신 1에서 시작).

[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

파이썬 2.6에서 할 수있는 것을 알고 있습니다 : h = enumerate (range (2000, 2005), 1) 위의 결과를 제공하지만 python2.5에서는 할 수 없습니다 ...

python2.5 사용하기 :

>>> h = enumerate(range(2000, 2005))
>>> [x for x in h]
[(0, 2000), (1, 2001), (2, 2002), (3, 2003), (4, 2004)]

파이썬 2.5에서 원하는 결과를 얻는 방법을 아는 사람이 있습니까?

감사,

제프


4
전문적으로 파이썬 방식으로 많은 일을하지 않은 사람이기 때문에 궁금합니다. 귀사는 호환성 이유로 업그레이드를 원하지 않기 때문에 Python 2.5로 제한되어 있습니까?
Sean

2
모든 2.x 버전은 이전 버전과 호환되므로 그럴 이유가 없습니다.
Jochen Ritzel

거기에 몇 밖으로 Py를 2.5에서 그 일이 아닌 Py를 2.6있다 - 일부 모듈에 있음을 말해
xorsyst

답변:


179

이미 언급했듯이 이것은 Python 2.6 이상에서 간단합니다.

enumerate(range(2000, 2005), 1)

Python 2.5 및 이전 버전은 start매개 변수를 지원하지 않으므로 두 개의 범위 오브젝트를 작성하고 압축 할 수 있습니다.

r = xrange(2000, 2005)
r2 = xrange(1, len(r) + 1)
h = zip(r2, r)
print h

결과:

[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

목록 대신 생성기를 생성하려면 izip을 대신 사용할 수 있습니다 .


사용 izip하고 xrange가까이 될 것은 열거합니다
존 라 Rooy

7
이 답변은 오래되었습니다. 이제 enumerate(iterable, start=1)Python 2.6부터 사용할 수 있습니다.
프레드릭 브레넌

@frb : 질문을 읽었습니까? 그는 이미 Python 2.6의 솔루션을 알고 있습니다. 그는 구체적으로 Python 2.5에서 작동하는 솔루션을 요청했습니다.
Mark Byers 2013

1
@MarkByers 분명히 나는 ​​장님입니다 :) 정말 죄송합니다. (이것은 "열거는 1부터 시작"에 대한 구글의 # 1이다)
프레드릭 브레넌

2
@ 8chan p, 난 그냥 구글 검색에서 "제로 파이썬에서 시작 열거
합니까

166

이것을 후손을 위해 여기에두기 위해 2.6에서 "start"매개 변수가 다음과 같이 열거되었습니다.

enumerate(sequence, start=1)


26
이것은 목록의 첫 번째 항목을 건너 뛰지 않고 시작 값으로 색인을 오프셋하므로 sequence[i]코드에서 다음과 같은 작업을 수행하면 범위를 벗어난 배열을 얻을 수 있습니다.
phyatt

14

쉽고, 원하는 것을 수행하는 자신의 기능을 정의하십시오.

def enum(seq, start=0):
    for i, x in enumerate(seq):
        yield i+start, x

12

파이썬 3

공식 문서 : enumerate(iterable, start=0)

따라서 다음과 같이 사용하십시오.

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']

>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]

>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

10

파이썬 2.5에서 가장 간단한 방법은 당신이 묻는 것입니다.

import itertools as it

... it.izip(it.count(1), xrange(2000, 2005)) ...

표시되는 것처럼 목록을 원하면 zip대신 사용하십시오 it.izip.

(BTW, 일반적으로, 가장 좋은 방법은 발전기의 목록을 만들거나 다른 반복 가능한 X는 하지 [x for x in X] 않고 있지만 list(X)).


6
from itertools import count, izip

def enumerate(L, n=0):
    return izip( count(n), L)

# if 2.5 has no count
def count(n=0):
    while True:
        yield n
        n+=1

이제 h = list(enumerate(xrange(2000, 2005), 1))작동합니다.


6

열거는 사소한 일이므로 시작을 수락하도록 다시 구현합니다.

def enumerate(iterable, start = 0):
    n = start
    for i in iterable:
        yield n, i
        n += 1

이것은 start 인수없이 enumerate를 사용하여 코드를 중단하지 않습니다. 또는이 oneliner는보다 우아하고 빠를 수 있지만 열거의 다른 사용을 중단합니다.

enumerate = ((index+1, item) for index, item)

후자는 순수한 넌센스였습니다. @ 던컨 래퍼 권리가 있습니다.


그렇습니다. 이 라인을 따라 무언가가 실제로 Haskell에서 작동합니다 (카레는 그 언어에서 가장 자연스럽고 게으름 때문에 목록을 취하는 함수는 생성기 표현과 매우 유사합니다). 그러나 그것은 오랫동안 파이썬 사용자-BS를 쓰는 것을 실례하지 않습니다. 지적 해 주셔서 감사합니다.

5
>>> list(enumerate(range(1999, 2005)))[1:]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

열거자는 발전기 여야합니다. 허용되지 않는 경우가 자주 반복되도록 전체 목록을 한 번에 작성
John La Rooy

일반화 : start = 4 list (enumerate (range (start) + range (1999, 2005))) [start :]
Tony Veijalainen

범위는 그러나 2.52에 목록
Tony Veijalainen

3

h = [(i + 1, x) for i, x in enumerate(xrange(2000, 2005))]


1
그는 파이썬 2.5에서 이것을 할 수 없습니다. start 매개 변수는 Python 2.6에서 도입되었습니다 ( docs.python.org/library/functions.html#enumerate) . 그는 또한 질문에서 이것을 언급합니다.
Mark Byers

코드가 형식화되지 않았고 문제가 목록 대신 생성기를 사용하는 것처럼 보였을 때 초기 편집 전에 이것을 대답했습니다.
Chris B.

++: 그렇게하는 방법입니다
Nas Banov

2

좋아, 나는 여기에 약간 바보 같은 느낌이 든다 ... 무슨 일을하지 않는 이유는 무엇
[(a+1,b) for (a,b) in enumerate(r)]입니까? 작동하지 않으면 문제가 없습니다.

>>> r = range(2000, 2005)
>>> [(a+1,b) for (a,b) in enumerate(r)]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

>>> enumerate1 = lambda r:((a+1,b) for (a,b) in enumerate(r)) 

>>> list(enumerate1(range(2000,2005)))   # note - generator just like original enumerate()
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

1
>>> h = enumerate(range(2000, 2005))
>>> [(tup[0]+1, tup[1]) for tup in h]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

이것은 다소 장황하므로 일반화하기 위해 자신의 함수를 작성하는 것이 좋습니다.

def enumerate_at(xs, start):
    return ((tup[0]+start, tup[1]) for tup in enumerate(xs))

2
열거자는 발전기 여야합니다. 종종 받아 들일 수없는 경우 반복하기 위해 전체 목록을 한 번에 작성
John La Rooy

0

이 게시물이 다음보다 어떻게 복잡해질 수 있는지 모르겠습니다.

# Just pass the start argument to enumerate ...
for i,word in enumerate(allWords, 1):
    word2idx[word]=i
    idx2word[i]=word
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.