2017-04-11 56 views
-1

例如,我有這個如何返回包含子串的數組的索引?

list = [('motor', 2),('steel',1),('metal',4)] 

如何獲取包含單詞金屬行的指數?我試過使用

list.index('metal') 

但它說金屬不在列表中。

+1

在我看來,你需要一本字典,使其工作 – valeas

+0

你是什麼意思? – Jessie

+0

正如已經指出的答案,您不能使用索引訪問元組,並且將元組作爲列表的元素。你可以將你的列表轉換成程序中的字典嗎? – valeas

回答

2

「它說,金屬是不是在列表中。」

而且它是正確的。 "metal"字符串不是您列表中的元素(順便說一句,它不應該被稱爲list),它是列表元組的元素。

data = [('motor', 2),('steel',1),('metal',4)] 
print(data.index(('metal',4))) 
# 2 

如果你想在'metal'是元組的第二個元素,你可以只使用一個dict

print(dict(data)['metal']) 
# 4 

如果只想如果有一個精確匹配index()方法返回一個索引包含'metal'元組的索引,你可以使用:

print([i for i in range(len(data)) if 'metal' in data[i]]) 
# [2] 

如果你只想要第一個索引,見@tobias_k's answer

+0

如果我的數組是:list = [['motor',2],['steel',1],['metal',4]]金屬,會有一個更簡單的方法來做到這一點編程? – Jessie

2

你不能只用index,因爲列表中的每個元素實際上是元素的tuple。您可以enumerate列表,並返回一個包含給定的字符串,使用in,或-1如果沒有這樣的元素可以找到next元素。

>>> lst = [('motor', 2), ('steel', 1), ('metal', 4)] 
>>> next((i for i, tp in enumerate(lst) if "metal" in tp), -1) 
2 
>>> next((i for i, tp in enumerate(lst) if "foo" in tp), -1) 
-1 

如果這些元組始終有兩個元素,你知道哪些元素會匹配,你也可以使用元組拆包發電機表達的內部,並比較的一個值,而不是直接使用in

>>> next((i for i, (x, y) in enumerate(lst) if (x == "metal")), -1) 
2 

此外,最好不要用list作爲變量名,因爲它陰影內置式。

+0

不錯,我不知道'next'接受一個回退值而不是拋出StopIteration。假的值是否會比'-1'更好?這可以解釋爲一個指數? –

+1

@EricDuminil你必須檢查任何一種方式,但你也可以只返回'None'或讓'next'引發異常,就像'index'一樣。 –

相關問題