2009-03-03 8 views

答えて

36

おそらく、リストメソッド.indexを使用することをお勧めします。あなたが必要とする特別な処理を

def __eq__(self, other): 
    return self.Value == other.Value 

:リスト内のオブジェクトの

は、あなたのような何かを行うことができます。

使用することもできます用/列挙(ARR)Dive Into Pythonから値> 100

for index, item in enumerate(arr): 
    if item > 100: 
     return index, item 

Source

8

indexメソッドi = array.index(value)がありますが、カスタム比較演算子を指定することはできません。しかし、独自の関数を書くことは難しくありません。

def custom_index(array, compare_function): 
    for i, v in enumerate(array): 
     if compare_function(v): 
      return i 
204

を持っているアイテムのインデックスを見つけることの

例と文で:

>>> li 
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements'] 
>>> li.index("example") 
5 
+1

ありがとう、これは私が探していたまさにでしたし、それは完全に働きました! –

+12

しかし、このコードは、要素がリストにないときにエラーを返します。現在のコンテキストでは、 'three'を検索すると、li.index( 'three'))エラーが発生します。 –

+3

エラーを検出して、何かがリストにないときに検出することができます。 'try:li.index(" three ")を除いてValueError:found = falseを返します。 –

6

liのインデックス方法stはあなたのためにこれを行います。注文を保証する場合は、最初にsorted()を使用してリストをソートします。

a = [5, 4, 3] 
print sorted(a).index(5) 

または::

a = ['one', 'aardvark', 'a'] 
print sorted(a, key=len).index('a') 
1

どのようにこの1つはだソートは、ソートがどうなるかを指示するために、CMPやキーパラメータを受け入れますか?

def global_index(lst, test): 
    return (pair[0] for pair in zip(range(len(lst)), lst) if test(pair[1])) 

使用法:

>>> global_index([1, 2, 3, 4, 5, 6], lambda x: x>3) 
<generator object <genexpr> at ...> 
>>> list(_) 
[3, 4, 5] 
+3

pythonicを取得します: def global_index(lst、test): return(idxのidx、valは列挙する(lst)if test(val)) – recursive

+5

フィルタ(lambda x:x> 3、[1,2,3,4,5,6]) –

20

ここでは(一部の人々は、それは議論の余地が見つけるかもしれない)リストの内包表記を使用して、別の方法です。簡単なテストには非常に親しみやすい。 (私は多くのことを必要とする)オブジェクト属性の比較:リストで、適切な要素の、これが存在することを前提としてもちろん

el = [x for x in mylist if x.attr == "foo"][0] 

(実際には、および、独自性)。

+4

'el = [x.attr ==" foo "の場合はxをmylistにする] ' if el :el [0]で何かをしなさい は "存在"の問題を解決します – berkus

12

あなたがnumpyの配列の値を検索すると仮定すると、 は、私はこのような何かがうまくいくかもしれないと思う:

Numpy.where(arr=="value")[0] 
115

あなただけの要素がリストかどうかに含まれているかどうかを確認したい場合は:

>>> li 
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements'] 
>>> 'example' in li 
True 
>>> 'damn' in li 
False 
+3

答えは最高です! =) – holms

3

私はこれをいくつかのtutosを適応させることによって見つけました。、そしてあなたのすべてにをGoogleに感謝;)

def findall(L, test): 
    i=0 
    indices = [] 
    while(True): 
     try: 
      # next value in list passing the test 
      nextvalue = filter(test, L[i:])[0] 

      # add index of this value in the index list, 
      # by searching the value in L[i:] 
      indices.append(L.index(nextvalue, i)) 

      # iterate i, that is the next index from where to search 
      i=indices[-1]+1 
     #when there is no further "good value", filter returns [], 
     # hence there is an out of range exeption 
     except IndexError: 
      return indices 

A非常に簡単な使用:

a = [0,0,2,1] 
ind = findall(a, lambda x:x>0)) 

[2, 3] 

P.S.私は一致する要素(Pythonの2.6)のインデックスを返す関数を使用して私の英語

6

をscuse:

def index(l, f): 
    return next((i for i in xrange(len(l)) if f(l[i])), None) 

そして、例えば任意の必要な式で必要な要素を取得するためのラムダ関数を経由して、それを使用要素名を使用します。

element = mylist[index(mylist, lambda item: item["name"] == "my name")] 

私のコードのいくつかの場所でそれを使用する必要がある場合、私はちょうど特定のfind関数を定義します。名前で要素を見つけるために:

def find_name(l, name): 
    return l[index(l, lambda item: item["name"] == name)] 

をし、それは非常に簡単で読みやすいです:

element = find_name(mylist,"my name") 
関連する問題