web-dev-qa-db-ja.com

Forループ内のインデックスにアクセスしますか?

次のようなリストのインデックス自体にアクセスするにはどうすればいいですか?

ints = [8, 23, 45, 12, 78]

forループを使ってそれをループするとき、この場合1から5までのループインデックスにどうやってアクセスすればいいですか?

3057
Joan Venge

インデックス変数(通常はCやPHPなどの言語で使用される)などの追加の状態変数を使用することは、非Pythonicと見なされます。

より良い選択肢はPython 2と3の両方で利用可能な組み込み関数 enumerate() を使うことです:

for idx, val in enumerate(ints):
    print(idx, val)

PEP 279 をチェックしてください。

5061
Mike Hordecki

Forループを使用して、この場合1から5のループインデックスにアクセスするにはどうすればよいですか。

反復するときにenumerateを使用して要素のインデックスを取得します。

for index, item in enumerate(items):
    print(index, item)

そして、Pythonのインデックスはゼロから始まるので、上記で0から4になるでしょう。 1から5までのカウントが必要な場合は、次のようにします。

for count, item in enumerate(items, start=1):
    print(count, item)

統一管理フロー

あなたが求めているのは、以下のものと同等のPythonicです。これは、低レベル言語のほとんどのプログラマーが使用するアルゴリズムです。

index = 0            # Python's indexing starts at zero
for item in items:   # Python's for loops are a "for each" loop 
    print(index, item)
    index += 1

For-eachループがない言語では、

index = 0
while index < len(items):
    print(index, items[index])
    index += 1

pythonでは、もっと一般的に(しかし単体的に)見つかることもあります。

for index in range(len(items)):
    print(index, items[index])

列挙関数を使用する

Pythonの enumerate function は、インデックスの計算を隠し、イテラブルを別のイテラブル(enumerateオブジェクト)にカプセル化することで、視覚的な乱雑さを軽減します。提供します。それはこんな感じです:

for index, item in enumerate(items, start=0):   # default is zero
    print(index, item)

このコードサンプルは、Pythonの慣用句ではないコードとそうでないコードとの違いの canonical の例に相当なります。慣用コードは洗練された(しかし複雑ではない)Pythonであり、使用されることを意図した方法で書かれています。慣用句コードは言語の設計者から期待されています。つまり、通常このコードの方が読みやすいだけでなく、より効率的です。

カウントを取得する

あなたが行っているようにあなたがインデックスを必要としなくても、あなたは1から始めることができ、あなたは繰り返しのカウントを必要とします(時には望ましい)そしてあなたのカウントになるでしょう。

for count, item in enumerate(items, start=1):   # default is zero
    print(item)

print('there were {0} items printed'.format(count))

あなたが1から5まで欲しいと言ったとき、カウントはあなたが(インデックスとは対照的に)あなたが求めるつもりであるより多くのようです。


それを分解する - ステップバイステップの説明

これらの例を分解するために、インデックスを使って繰り返したい項目のリストがあるとします。

items = ['a', 'b', 'c', 'd', 'e']

今度はこれを列挙型に渡し、列挙型オブジェクトを作成します。

enumerate_object = enumerate(items) # the enumerate object

next関数を使ってループに入る、このイテラブルから最初の項目を取り出すことができます。

iteration = next(enumerate_object) # first iteration from enumerate
print(iteration)

そして、最初のインデックスである0と最初のアイテムである'a'のTupleを取得します。

(0, 'a')

この2タプルから要素を抽出するために " sequence unpacking "と呼ばれるものを使うことができます。

index, item = iteration
#   0,  'a' = (0, 'a') # essentially this.

そしてindexを調べると、それは最初のインデックス0を参照し、itemは最初の項目'a'を参照しています。

>>> print(index)
0
>>> print(item)
a

結論

  • Pythonインデックスはゼロから始まります
  • 反復するときにこれらのインデックスを反復可能オブジェクトから取得するには、enumerate関数を使用します。
  • 慣用的な方法で(Tupleの解凍と共に)列挙型を使用すると、より読みやすく保守しやすいコードが作成されます。

そうこれをしなさい:

for index, item in enumerate(items, start=0):   # Python indexes start at zero
    print(index, item)
618
Aaron Hall

1以外の0から始めるのはとても簡単です。

for index, item in enumerate(iterable, start=1):
   print index, item

注意

重要なヒント、index以降の少し誤解を招く可能性があるが、ここではTuple(idx, item)になります。

118
Clayton
for i in range(len(ints)):
   print i, ints[i]
76
David Hanak

Pythonの標準であるように、これを行うにはいくつかの方法があります。すべての例で仮定します:lst = [1, 2, 3, 4, 5]

1.列挙を使用する( 最も慣用句と見なされる

for index, element in enumerate(lst):
    # do the things that need doing here

無限再帰に入る可能性が排除されているので、これは私の考えでは最も安全なオプションです。アイテムとそのインデックスの両方が変数に保持されており、アイテムにアクセスするためにそれ以上のコードを書く必要はありません。

2.インデックスを保持するための変数を作成する(forを使用)

for index in range(len(lst)):   # or xrange
    # you will have to write extra code to get the element

3.インデックスを保持するための変数を作成する(whileを使用)

index = 0
while index < len(lst):
    # you will have to write extra code to get the element
    index += 1  # escape infinite recursion

4.いつも他の方法があります

前に説明したように、ここで説明されていない他の方法でこれを行うことができ、それらは他の状況でもっともっと適用するかもしれません。 例えば forと共にitertools.chainを使用する。他の例よりもネストされたループをうまく処理します。

40
Charitoo

昔ながらの方法:

for ix in range(len(ints)):
    print ints[ix]

リスト内包:

[ (ix, ints[ix]) for ix in range(len(ints))]

>>> ints
[1, 2, 3, 4, 5]
>>> for ix in range(len(ints)): print ints[ix]
... 
1
2
3
4
5
>>> [ (ix, ints[ix]) for ix in range(len(ints))]
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
>>> lc = [ (ix, ints[ix]) for ix in range(len(ints))]
>>> for tup in lc:
...     print tup
... 
(0, 1)
(1, 2)
(2, 3)
(3, 4)
(4, 5)
>>> 
23
Charlie Martin

次がPythonicかどうかはわかりませんが、Python関数enumerateを使用してインデックスと値を出力します。

int_list = [8, 23, 45, 12, 78]
for index, value in enumerate(int_list):
   print(index, value)

出力:

0 8
1 23
2 45
3 12
4 78
18
user2912389

Python 2.7 のループ内でリストのインデックスにアクセスする最も速い方法は、小さいリストには rangeメソッド を、中規模から巨大サイズのリストには enumerateメソッド を使うことです。

以下のコードサンプルの さまざまなアプローチ を参照して、リストおよびアクセスインデックス値を反復することができる、および それらのパフォーマンスメトリクス を参照してください。

from timeit import timeit

# Using range
def range_loop(iterable):
    for i in range(len(iterable)):
        1 + iterable[i]

# Using xrange
def xrange_loop(iterable):
    for i in xrange(len(iterable)):
        1 + iterable[i]

# Using enumerate
def enumerate_loop(iterable):
    for i, val in enumerate(iterable):
        1 + val

# Manual indexing
def manual_indexing_loop(iterable):
    index = 0
    for item in iterable:
        1 + item
        index += 1

下記の各方法のパフォーマンス指標を参照してください。

from timeit import timeit

def measure(l, number=10000):
print "Measure speed for list with %d items" % len(l)
print "xrange: ", timeit(lambda :xrange_loop(l), number=number)
print "range: ", timeit(lambda :range_loop(l), number=number)
print "enumerate: ", timeit(lambda :enumerate_loop(l), number=number)
print "manual_indexing: ", timeit(lambda :manual_indexing_loop(l), number=number)

measure(range(1000))
# Measure speed for list with 1000 items
# xrange:  0.758321046829
# range:  0.701184988022
# enumerate:  0.724966049194
# manual_indexing:  0.894635915756

measure(range(10000))
# Measure speed for list with 100000 items
# xrange:  81.4756360054
# range:  75.0172479153
# enumerate:  74.687623024
# manual_indexing:  91.6308541298

measure(range(10000000), number=100)
# Measure speed for list with 10000000 items
# xrange:  82.267786026
# range:  84.0493988991
# enumerate:  78.0344707966
# manual_indexing:  95.0491430759

その結果、rangeメソッドを使用するのが1000項目のリストまでの最速の方法です。サイズが10 000を超えるアイテムのリストはenumerateが勝者です。

以下に便利なリンクを追加してください。

18
Andriy Ivaneyko
ints = [9, 23, 45, 12, 78]
ints.extend([1,2,3,4,5,6,7,8])
for idx, val in enumerate(ints):
    print(idx,val)

このようにしてリストを拡張することができます。拡張とは、一度に複数の値を追加できることを意味します。

このリストを追加するには、以下のコードを書く必要があります。

ints = [9, 23, 45, 12, 78]
ints.append([1])
for idx, val in enumerate(ints):
    print(idx,val)

これにより、一度に1つの値を追加できます。 ints.append([1])と書くと、この要素のサブリストが作成されます。

15
iamjayp

まず最初に、インデックスは0から4になります。プログラミング言語は0から数え始めます。それを忘れないでください、さもなければあなたは範囲外の例外に出くわすでしょう。 forループに必要なのは、0から4までを数える変数です。

for x in range(0, 5):

ループは最大値の前の1つの数値を停止するので、私は0から5を書きました。 :)

インデックスの値を取得するには

list[index]
11
ytpillai

あなたはこのコードでそれをすることができます:

ints = [8, 23, 45, 12, 78]
index = 0

for value in (ints):
    index +=1
    print index, value

ループの終わりにインデックス値をリセットする必要がある場合は、このコードを使用してください。

ints = [8, 23, 45, 12, 78]
index = 0

for value in (ints):
    index +=1
    print index, value
    if index >= len(ints)-1:
        index = 0
9
Liam

この議論によると: http://bytes.com/topic/python/answers/464012-objects-list-index

ループカウンタの繰り返し

インデックスをループ処理するための現在の慣用句では、組み込みの 'range'関数を使用しています。

for i in range(len(sequence)):
    # work with index i

要素とインデックスの両方をループすることは、古い慣用句によって、または新しい 'Zip'組み込み関数を使用することによって達成できます[2]。

for i in range(len(sequence)):
    e = sequence[i]
    # work with index i and element e

または

for i, e in Zip(range(len(sequence)), sequence):
    # work with index i and element e

http://www.python.org/dev/peps/pep-0212/ を介して

9
thinker007

この問題に対する最善の解決策は、 列挙 in-build python関数を使用することです。 
列挙 return タプル  
最初の値は index です。 
2番目の値は、そのインデックスにある配列の 要素 です。

In [1]: ints = [8, 23, 45, 12, 78]

In [2]: for idx, val in enumerate(ints):
   ...:         print(idx, val)
   ...:     
(0, 8)
(1, 23)
(2, 45)
(3, 12)
(4, 78)
8
Anurag Misra

リストに重複する値がない場合

for i in ints:
    indx = ints.index(i)
    print(i,indx)

それ以外の場合はenumerateを使用してください。 

for counter, value in enumerate(ints):
    print(counter, value)

または以下を使用してください。

for counter in range(len(ints)):
    print(counter, ints[counter])
6
RIshu

forループでインデックスにアクセスしたときに得られるものは次のとおりです。

for i in enumerate(items): print(i)

enter image description here

for i, val in enumerate(items): print(i, val)

enter image description here

for i, val in enumerate(items): print(i)

enter image description here

お役に立てれば。

4
ARGeo

あなたの質問では、あなたは "この場合1から5まで、どうやってループインデックスにアクセスするのですか?"と書いています。

ただし、リストのインデックスは0から始まります。そのため、実際に必要なのはリスト内の各項目のインデックスと項目なのか、それとも1から始まる番号が本当に必要なのかを知る必要があります。幸いなことに、pythonではどちらか一方または両方が簡単です。

最初に、列挙型関数を明確にするために、リスト内の各項目のインデックスと対応する項目を繰り返し返します。

alist = [ 1, 2, 3, 4, 5 ]

for n,a in enumerate(alist):
    print( "%d %d"%(n,a) )

上記の出力は、

0 1
1 2
2 3
3 4
4 5

インデックスが0から実行されることに注意してください。この種のインデックスは、pythonやcなどの最新のプログラミング言語で一般的です。

ループをリストの一部に広げたい場合は、リストの一部に標準のPython構文を使用できます。たとえば、リストの2番目の項目から最後の項目までを含めずにループするには、次のようにします。

for n,a in enumerate(alist[1:-1]):
    print( "%d %d"%(n,a) )

繰り返しますが、出力インデックスは0から始まります。

0 2
1 3
2 4

それは私達をenumerate()のためのstart = nスイッチに連れて行きます。これは単にインデックスをオフセットするだけです。ループ内でインデックスに数値を単純に追加することもできます。

for n,a in enumerate(alist,start=1):
    print( "%d %d"%(n,a) )

出力は

1 1
2 2
3 3
4 4
5 5
3
DrM

これも試すことができます。

data = ['itemA.ABC', 'itemB.defg', 'itemC.drug', 'itemD.ashok']
x = []
for (i, item) in enumerate(data):
      a = (i, str(item).split('.'))
      x.append(a)
for index, value in x:
     print(index, value)

出力は 

0 ['itemA', 'ABC']
1 ['itemB', 'defg']
2 ['itemC', 'drug']
3 ['itemD', 'ashok']

もしnums = [1,2,3,4,5] を繰り返すとします。

for i, num in enumerate(nums, start = 1):
    print(i, num)

または、長さをl = len(nums)として取得します

for i in range(1, l + 1):
    print(i, nums[i])
2
Ankur Kothari

indexメソッドを使うことができます

ints = [8, 23, 45, 12, 78]
inds = [ints.index(i) for i in ints]

_ edit _ intsに重複がある場合、このメソッドは機能しないというコメントで強調表示されているので、以下のメソッドはints内のすべての値に対して機能するはずです。

ints = [8, 8, 8, 23, 45, 12, 78]
inds = [tup[0] for tup in enumerate(ints)]

または代わりに

ints = [8, 8, 8, 23, 45, 12, 78]
inds = [tup for tup in enumerate(ints)]

intsのインデックスと値の両方をタプルのリストとして取得したい場合。

この質問に対する選択された回答ではenumerateの方法を使用しますが、リスト内包表記を使用するので、少ないコードでより速くなります。

1
PyRsquared

forループを使用してリスト内包内に(index、value)のタプルを表示するには

ints = [8, 23, 45, 12, 78]
print [(i,ints[i]) for i in range(len(ints))]

出力:

[(0, 8), (1, 23), (2, 45), (3, 12), (4, 78)]
0
lola

これは目的を十分に果たします:

list1 = [10, 'sumit', 43.21, 'kumar', '43', 'test', 3]
for x in list1:
    print('index:', list1.index(x), 'value:', x)
0
Sumit Kumar

index()メソッドを使っても可能です。 

for i in ints:
   print(ints.index(i), i) 

ここではインデックスは0から始まります。しかし、1から始める必要がある場合は、次のようにindex()メソッドに1を加えるだけです

for i in int:
   print(int.index(i) + 1, i)    
0
Loochie