Pythonでリスト要素を含むインデックスを検索し、indexがエラーを報告しました!!!

3131 ワード

リスト["foo", "bar", "baz"]とリスト中の項目"bar"について、Pythonでインデックス(1)を取得するにはどうすればいいですか?
 
一、index
>>> ["foo", "bar", "baz"].index("bar")
1

次のように警告します.
注意してください.これはこの質問に答える最も徹底的な方法かもしれませんが、indexはかなり弱いコンポーネントlist APIですが、私は最後にその怒りを使ったことを覚えていません.コメントでは、この答えが大量に引用されているので、より完全であるべきだと指摘しています.list.indexに従ういくつかの警告について.最初にドキュメント文字列を表示する必要がある場合があります.
>>> print(list.index.__doc__)
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.

 
私が使用したほとんどの場所indexは、より普及しているため、リストの導出またはジェネレータ式を使用しています.したがって、indexの使用を検討している場合は、これらの優れたpython機能を確認してください.
要素がリストにない場合は、
アイテムが存在しない場合は、index結果ValueErrorが呼び出されます.
>>> [1, 1].index(2)
Traceback (most recent call last):
  File "", line 1, in 
ValueError: 2 is not in list

 
アイテムがリストにない場合は、
  • まず、item in my_list(クリーン、読み取り可能な方法)、または
  • をチェックします.
  • は、index呼をtry/exceptによってキャプチャされたブロック中のValueErrorに包む(少なくとも検索リストが長い場合、この項目は通常存在する.)

  •  
    二、enumerate()ほとんどの答えでは、単一のインデックスを検索する方法が説明されていますが、アイテムがリストに複数回存在する場合、それらのメソッドは複数のインデックスを返しません.用途enumerate():
    for i, j in enumerate(['foo', 'bar', 'baz']):
        if j == 'bar':
            print(i)

      index()関数は、最初の一致のみを返し、enumerate()はすべての一致を返します.
    リストとしての理解:
    [i for i, j in enumerate(['foo', 'bar', 'baz']) if j == 'bar']

     
    ここにはもう一つの小さな解決策itertools.count()(列挙とほぼ同じ):
    from itertools import izip as zip, count # izip for maximum efficiency
    [i for i, j in zip(count(), ['foo', 'bar', 'baz']) if j == 'bar']

     
    大きなリストの場合、これはenumerate()を使用するよりも有効です.
    $ python -m timeit -s "from itertools import izip as zip, count" "[i for i, j in zip(count(), ['foo', 'bar', 'baz']*500) if j == 'bar']"
    10000 loops, best of 3: 174 usec per loop
    $ python -m timeit "[i for i, j in enumerate(['foo', 'bar', 'baz']*500) if j == 'bar']"
    10000 loops, best of 3: 196 usec per loop

    三、NumPy
    すべてのインデックスが必要な場合は、NumPyを使用します.
    import numpy as np
    
    array = [1, 2, 1, 3, 4, 5, 1]
    item = 1
    np_array = np.array(array)
    item_index = np.where(np_array==item)
    print item_index
    # Out: (array([0, 2, 6], dtype=int64),)

     
    読みやすいソリューションです.
    四、zipzipの機能を持つすべてのインデックス:
    get_indexes = lambda x, xs: [i for (y, i) in zip(xs, range(len(xs))) if x == y]
    
    print get_indexes(2, [1, 2, 3, 4, 5, 6, 3, 2, 3, 2])
    print get_indexes('f', 'xsfhhttytffsafweef')