2010-01-11 108 views
0

這是我的前一個問題的後續關於searching in lists of lists目錄的項目時只有項目的一部分被稱爲

我有個對數值作爲它列出了清單。

[[ '一個',5],[ 'B',3],[ 'C',2]]

我知道每對的第一個元素,但我不知道第二個(這是一個計算的結果,並與第一個元素一起存儲在列表中)我按照計算項目的降序對列表進行排序

我想知道每個項目在哪個位置通常是: list.index('a')如果我沒有那裏的數字。有沒有辦法在不知道整個元素的情況下獲取索引號?

類似於: list.index(['a',?])其中?是通配符?

或者我應該只從第一個項目創建一個新的列表,以獲得它的索引?

+1

這不是你問的前一個問題的*相同*,而是用整數而不是字符串? Richie Hindle的答案是否有效? – 2010-01-11 06:35:21

+0

在我想知道某件物品是否存在之前。現在我想知道它在哪裏。無論是整數還是字符串。 – greye 2010-01-11 06:38:39

回答

5
[x[0] for x in list].index('a') 

但是,如果你正在運行這段代碼幾次,你可能要保存x的列表[0]的。

+0

如果您多次運行此代碼,您應該使用Michael Anderson的解決方案,以便您不必每次遍歷整個列表。 – Miles 2010-01-11 09:10:20

2

一個簡單,靈活的行版本:

[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返回。

+0

順便說一下,我遵循了這個問題的規範,所以上面的代碼產生了符合某些條件的元素的索引/索引......儘管如此,將它改爲返回元素本身也是微不足道的,或者'(index,element)對。 – 2010-01-11 07:43:21

2

您已經有了知道第一個元素的原始列表。列表稱它爲orig_list。從原始列表中獲取元素的索引,並在新列表中使用該索引進行檢索。

>>> orig_list = ['a','b','c'] 
>>> calc_list = [['a',5], ['b',3], ['c',2] ] 

>>> calc_list[orig_list.index('a')] 
['a',5] 
4

有類似的解決方案到Ofris

D = dict([ [x[1][0], x[0] ] for x in list(enumerate(L)) ]) 
D['a'] 
#returns 0 

但另一個很好的功能是,如果你調整這一點,你就可以拿出你的原始值

D = dict([ [x[1][0], (x[0], x[1][1]) ] for x in list(enumerate(L)) ]) 
D['a'][0] 
#returns 0 
D['a'][1] 
#returns 5 
+0

+1是迄今唯一使用字典的答案 – Miles 2010-01-11 09:05:13

1

代碼以下將得到列表中所有項目的匹配模式的索引['a', ?]

>>> l = [['a',5], ['b',3], ['c',2], ['a',8]] 
>>> indexes = [l.index(x) for x in l if x[0] == 'a'] 
>>> print indexes 
[0, 3] 
相關問題