私は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で希望する結果を得る方法を知っている人はいますか?
おかげで、
ジェフ
既に述べたように、これは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 を使用できます。
後世のためにここにこれを置くために、2.6で次のように列挙するために「開始」パラメーターが追加されました。
enumerate(sequence, start=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)) ...
リストが必要な場合は、it.izip
の代わりにZip
を使用してください。
(ところで、一般的なルールとして、ジェネレーターまたはその他の反復可能なXからリストを作成する最良の方法は、not[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引数なしのenumerateを使用してコードを壊さないことに注意してください。 あるいは、このonelinerはよりエレガントで、おそらくより高速かもしれませんが、enumerateの他の用途を壊します:
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)]
公式ドキュメント: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')]
>>> 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