2013-07-05 90 views
2

如果我有名單:如何返回組中某個特定值的列表中的一組值?

list1 = [(12, "AB", "CD"), (13, "EF", "GH"), (14, "IJ", "KL")]

我想是有它的價值13組的索引:

if 13 in list1[0]: 
     idx = list1.index(13) 
     item = list1[idx] 
     print str(item) 

     [13, EF, GH] 

當我嘗試這個,我不斷收到「索引不在列表中「,即使它正在傳遞if語句,因爲它在列表中找到值13。

+0

你可能會考慮粘貼確切引發的異常不是描述它。這是最清晰和最清潔的方式。話雖如此,你的問題不是在if語句,而是在if語句塊中。 – woozyking

+1

您正在接收錯誤,因爲13不在'list1'中。它在'list1 [1]'中。 – bogatron

+0

@bogatron 13不在'list1 [0]'中,它在'list1 [1]'中。 –

回答

3

您可以使用nextenumerate

>>> list1 = [(12, "AB", "CD"), (13, "EF", "GH"), (14, "IJ", "KL")] 
>>> next(i for i,x in enumerate(list1) if 13 in x) 
1 

用一個簡單的for循環:

for i, item in enumerate(list1): 
    if 13 in item: 
     print i 
     break 
...   
1 

更新:

如果每個元組的第一個項目是獨一無二的,你多次這樣做,然後首先創建一個字典。類型的字典提供O(1)查找,同時列出O(N)

>>> list1 = [(12, "AB", "CD"), (13, "EF", "GH"), (14, "IJ", "KL")] 
>>> dic = {x[0]:x[1:] for x in list1} 

訪問項目:

>>> dic[12] 
('AB', 'CD') 
>>> dic[14] 
('IJ', 'KL') 
#checking key existence 
>>> if 17 in dic:   #if a key exists in dic then do something 
     #then do something 
+0

謝謝。哪些會產生更好的性能?該列表可能包含數以萬計的記錄。 – user2259908

+0

@ user2259908他們兩個都是'O(N)'方法,差異將會非常小。其次是更可讀。 –

+0

@ user2259908如果第一項在每個元組中都是唯一的,並且您正在多次執行此操作,那麼我建議您創建一個字典以提高性能。 –

0

鑑於從註釋添加的標準「我真的不關心他們是在列表中」的任務變得更加容易並且更加明顯

def get_ids(id, tuple_list): 
    """returns members from tuple_list whose first element is id""" 
    return [x for x in tuple_list if x[0] == id] 

這並不像您想象的那樣昂貴,如果您回想起元組是不可變的對象。當解釋器構建新列表時,它只包含感興趣的元組的內部標識符(引用)。這與要求索引列表的原始問題保持一致。這裏使用的列表推導是構建新列表的有效方式,因爲許多工作都在解釋者的內部完成。簡而言之,來自C語言的關於性能的許多直覺並不適用於Python。

由於Ashwini noted,如果元組中的id號是唯一的,並且您正在進行多個查詢,那麼字典可能是更合適的結構。即使id號不唯一,也可以使用元組列表字典,但最好先做最清晰的事情,不要事先猜測性能。

如同字典的例子,因爲空列表是「falsey」 Python中,你可以使用相同的排序條件:

hits = get_ids(13, list1) 
if hits: 
    # we got at least one tuple back 
else: 
    # no 13s to be had 
相關問題