回答:
リスト内包表記を使用できます。
indices = [i for i, x in enumerate(my_list) if x == "whatever"]
enumerate
。ですから、Pythonが古い場合はを使用してくださいfilter()
。
print([i for i, x in enumerate([[1,1],[0,1]]) if x == 1])
返します。[]
[[0, 1], [0, 0], [1, 1]]
(a == 1).nonzero()
、NumPy配列の場合と同様のことが可能になりますa
。
リストの直接的な解決策ではありませnumpy
んが、この種のことには本当に優れています。
import numpy as np
values = np.array([1,2,3,1,2,4,5,6,3,2,1])
searchval = 3
ii = np.where(values == searchval)[0]
戻り値:
ii ==>array([2, 8])
これは、他のソリューションのいくつかと比較して、要素の数が多いリスト(配列)の場合に大幅に高速化できます。
[0]
が必要なのwhere
は、タプルが返されるからです(array([2, 8], dtype=int64),)
all_id_resp_address
はなりnp.array
ませんlist
。
list
とstr
、明らかにあなたは渡さFalse
にnp.where
。np.array
smth と比較すると。ブール値の配列を取得します。次に、その配列のnp.where
すべてのTrue
値の位置を見つけます。
を使用したソリューションlist.index
:
def indices(lst, element):
result = []
offset = -1
while True:
try:
offset = lst.index(element, offset+1)
except ValueError:
return result
result.append(offset)
enumerate
大きなリストの場合、でのリストの理解よりもはるかに高速です。また、すでにアレイがある場合は、numpy
ソリューションよりもはるかに遅くなります。それ以外の場合は、変換のコストがスピードゲインを上回ります(100、1000、10000要素の整数リストでテスト)。
注: Chris_Randsのコメントに基づく注意事項:結果が十分にスパースである場合、このソリューションはリスト内包よりも高速ですが、リストに検索対象の要素のインスタンスが多数ある場合(リストの約15%以上) 、1000個の整数のリストを使用したテストでは、リストの理解が速くなります。
timeit.timeit
ランダムに生成されたリストを使用していました。それは重要な点ですが、それがあなたの質問の理由かもしれません。当時私には起こりませんでしたが、速度の向上は、結果が十分にまばらである場合にのみ当てはまります。検索対象の要素をすべて含むリストでテストしたところ、リストの理解よりもはるかに遅い。
more_itertools.locate
条件を満たすすべてのアイテムのインデックスを検索します。
from more_itertools import locate
list(locate([0, 1, 1, 0, 1, 0, 0]))
# [1, 2, 4]
list(locate(['a', 'b', 'c', 'b'], lambda x: x == 'b'))
# [1, 3]
more_itertools
はサードパーティのライブラリ> pip install more_itertools
です。
conda install
最近のパフォーマンスは非常に不安定になっています)
すべての発生に対するもう1つの解決策(重複している場合は申し訳ありません):
values = [1,2,3,1,2,4,5,6,3,2,1]
map(lambda val: (val, [i for i in xrange(len(values)) if values[i] == val]), values)
または使用range
(python 3):
l=[i for i in range(len(lst)) if lst[i]=='something...']
(python 2)の場合:
l=[i for i in xrange(len(lst)) if lst[i]=='something...']
そして(両方の場合):
print(l)
さすがです。
python2でfilter()を使用します。
>>> q = ['Yeehaw', 'Yeehaw', 'Googol', 'B9', 'Googol', 'NSM', 'B9', 'NSM', 'Dont Ask', 'Googol']
>>> filter(lambda i: q[i]=="Googol", range(len(q)))
[2, 4, 9]
enumerate(alist)を使用すると、要素xが探しているものと等しい場合に、リストのインデックスである最初の要素(n)を格納できます。
>>> alist = ['foo', 'spam', 'egg', 'foo']
>>> foo_indexes = [n for n,x in enumerate(alist) if x=='foo']
>>> foo_indexes
[0, 3]
>>>
この関数は引数としてアイテムとリストを取り、前に見たようにリスト内のアイテムの位置を返します。
def indexlist(item2find, list_or_string):
"Returns all indexes of an item in a list or a string"
return [n for n,item in enumerate(list_or_string) if item==item2find]
print(indexlist("1", "010101010"))
出力
[1, 3, 5, 7]
for n, i in enumerate([1, 2, 3, 4, 1]):
if i == 1:
print(n)
出力:
0
4
for-loop
:enumerate
し、リストの内包が、より効率的かつ神託ある、しかし、この答えは、それらのいくつかの使用を許可されない場合があり、学生を対象として組み込み関数を。indices
for i in range(len(x)):
。これは、基本的にインデックスの場所のリストを反復処理します[0, 1, 2, 3, ..., len(x)-1]
i
ところ、x[i]
マッチがあるとvalue
し、indices
x[i]
インデックスでリストにアクセスしますdef get_indices(x: list, value: int) -> list:
indices = list()
for i in range(len(x)):
if x[i] == value:
indices.append(i)
return indices
n = [1, 2, 3, -50, -60, 0, 6, 9, -60, -60]
print(get_indices(n, -60))
>>> [4, 8, 9]
while-loop
と.index
:def get_indices(x: list, value: int) -> list:
indices = list()
i = 0
while True:
try:
# find an occurrence of value and update i to that index
i = x.index(value, i)
# add i to the list
indices.append(i)
# advance i by 1
i += 1
except ValueError as e:
break
return indices
print(get_indices(n, -60))
>>> [4, 8, 9]
get_indeices
は、通常のリスト内包よりも少し高速(〜15%)です。私はそれを理解しようとしています。