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
'programing' 카테고리의 다른 글
| 리더를 InputStream으로, 라이터를 OutputStream으로 변환하는 방법 (0) | 2023.01.31 |
|---|---|
| move_movel_file은 "오픈 스트림에 대한 접근:권한 거부" 오류 (0) | 2023.01.31 |
| Vue - 여러 확인란이 있는 입력 (0) | 2023.01.31 |
| MySQL에서 "오버헤드"는 무엇을 의미하며, 무엇이 문제이며, 어떻게 수정해야 합니까? (0) | 2023.01.31 |
| Android: export를 명시적으로 지정해야 합니다. Android 12 이상을 대상으로 하는 앱은 다음을 지정해야 합니다. (0) | 2023.01.31 |