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 |