web-dev-qa-db-ja.com

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)上記の結果を与えるが、python2.5ではできません...

Python2.5の使用:

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

python 2.5で希望する結果を得る方法を知っている人はいますか?

おかげで、

ジェフ

127
JeffTaggary

既に述べたように、これはPython 2.6以降で簡単に実行できます。

enumerate(range(2000, 2005), 1)

Python 2.5以前はstartパラメーターをサポートしていないため、代わりに2つの範囲オブジェクトを作成してZipできます。

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 を使用できます。

146
Mark Byers

後世のためにここにこれを置くために、2.6で次のように列挙するために「開始」パラメーターが追加されました。

enumerate(sequence, start=1)

151
dhackner

簡単に、あなたが望むことをする独自の関数を定義するだけです:

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

Python 2.5で行う最も簡単な方法は、まさにあなたが求めていることです。

import itertools as it

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

リストが必要な場合は、it.izipの代わりにZipを使用してください。

(ところで、一般的なルールとして、ジェネレーターまたはその他の反復可能なXからリストを作成する最良の方法は、not[x for x in X]ですが、list(X)です)。

10
Alex Martelli
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
Jochen Ritzel

enumerateは簡単なため、開始を受け入れるために再実装します。

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

これは、start引数なしのenumerateを使用してコードを壊さないことに注意してください。 あるいは、このonelinerはよりエレガントで、おそらくより高速かもしれませんが、enumerateの他の用途を壊します:

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

後者は純粋なナンセンスでした。 @Duncanはラッパーを正しく取得しました。

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

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

3
Chris B.

さて、私はここで少し愚かだと思う...のようなものだけでそれをしない理由は何ですか
[(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)]
2
Nas Banov

Python 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')]
1
winklerrr
>>> 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))
1
Eli Courtwright

これらの投稿が以下よりも複雑になる可能性があることはわかりません。

# Just pass the start argument to enumerate ...
for i,Word in enumerate(allWords, 1):
    Word2idx[Word]=i
    idx2Word[i]=Word
0
bmc