programing

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

bestcode 2023. 1. 31. 20:49
반응형

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

Python 2.5를 사용하고 있기 때문에 다음과 같이 열거하고 싶습니다(0이 아닌 1부터 시작).

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

Python 2.6에서는 위의 결과를 얻기 위해 h = enumerate(range(2000, 2005), 1) 할 수 있지만 Python 2.5에서는 할 수 없습니다.

Python 2.5 사용:

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

Python 2.5에서 원하는 결과를 얻을 수 있는 방법을 아는 사람 있나요?

이미 언급했듯이, 이것은 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을 사용할 수 있습니다.

후세를 위해 여기에 두기 위해 2.6에서는 다음과 같이 "시작" 매개 변수가 추가되었습니다.

enumerate(sequence, start=1)

파이썬 3

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

다른 답변에서 알 수 있듯이 자체 발전기를 작성할 필요가 없습니다.내장된 Python 표준 라이브러리에는 이미 원하는 기능을 수행하는 기능이 포함되어 있습니다.

>>> 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')]

내장 함수는 다음과 같습니다.

def enumerate(sequence, start=0):
  n = start
  for elem in sequence:
    yield n, elem
    n += 1

간단하게 원하는 기능을 스스로 정의할 수 있습니다.

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

Python 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)).

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))작동하다.

enumerate는 사소한 것이므로 시작을 받아들이기 위해 다시 시도합니다.

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

start 인수 없이 열거를 사용해도 코드가 끊어지지 않습니다.또는 이 oneliner가 더 우아하고 더 빠를 수 있지만 열거의 다른 용도는 깨집니다.

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

후자는 완전히 난센스였다.@Duncan은 포장지를 맞췄다.

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

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

좋아, 내가 좀 멍청하게 느껴져...그냥 이런 걸로 안 하는 이유가 뭐야?
[(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)]
>>> 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))

이러한 투고가 어떻게 다음보다 더 복잡해질 수 있는지 모르겠습니다.

# Just pass the start argument to enumerate ...
for i,word in enumerate(allWords, 1):
    word2idx[word]=i
    idx2word[i]=word

언급URL : https://stackoverflow.com/questions/3303608/how-to-enumerate-a-range-of-numbers-starting-at-1

반응형