一個簡單,靈活的行版本:
[i for (i, item) in enumerate([('a', 1), ('b', 3), ('a', 5)]) if item[0] == 'a']
# returns [0, 2]
[i for (i, item) in enumerate([('a', 1), ('b', 3), ('a', 5)]) if item[0] == 'a'][0]
# returns 0
你可以把它包在一個函數,通過調用替換item[0] == 'a'
到任意謂詞(像我原來的答案,這就是它的靈活)等。如果找不到任何項目,上面的第二個版本將會引發異常,所以將其包裝在try/except中;第一個將返回一個空列表。
如果你喜歡這份工作一個單獨的函數,看看下面的一個...它的僅耗時需要找到一個合適的項目儘可能多的迭代的好處。
原來的答覆:
這將讓你找到的第一個項目的索引擁有你能想到的任何財產,但你需要表達它作爲一個函數(lambda x: x[0] == 'a'
足以在你的榜樣情況):
def index_by(pred, iterable):
i = 0
found = False
for item in iterable:
if pred(item):
found = True
break
i += 1
return i if found else None
呼叫像這樣:
index_by(lambda x: x[0] == 'a', [('b', 1), ('a', 5)]) # returns 1
以獲得第一項的基於零的索引中的滿足所述給定PRED可迭代icate。 (換句話說,作爲第一個參數傳入的函數的第二個參數傳入的iterable中的第一個項目返回true值)。
如果iterable不包含滿足謂詞的元素,None
返回。
這不是你問的前一個問題的*相同*,而是用整數而不是字符串? Richie Hindle的答案是否有效? – 2010-01-11 06:35:21
在我想知道某件物品是否存在之前。現在我想知道它在哪裏。無論是整數還是字符串。 – greye 2010-01-11 06:38:39