2012-10-20 111 views
1
a = [[1,2,3],[4,5,6]] 

我想獲得0123並獲得1456擁有列表清單 - 如何獲取包含項目的列表的索引?

當然

我可以做這樣的事情:

def get_index(my_list, my_item): 
    for i, j in enumerate(my_list): 
     if my_item in j: 
      return i 
    raise ValueError("Item not in any list") 

是否有這樣做的更好的辦法?

+0

我想您的解決方案几乎沒有改進的餘地。 – hochl

+0

是不是有一個很好的Python單線? – zenpoy

+1

'下一個(我爲i,j在枚舉(a)如果my_item在j)'是一個單線程,但它會在失敗時引發'StopIteration',因此您的錯誤信息會更好。你可以添加一個默認值None或者什麼,但我想我仍然更喜歡你的解決方案。如果你多次這樣做,雖然它可能會更好地建立索引字典。 – DSM

回答

2

更新答:

這是我原來的答覆的改進版本,由於輸入從zenply的OP。

b = [[1,2,3],[4,5,6],[1,4,5], [4,7,8]] 

def create_dict_2(a): 
    my_dict = {} 
    for index, sublist in enumerate(a): 
     for ele in sublist: 
      if not ele in my_dict: 
       my_dict[ele] = index 
    return my_dict 

結果:

>>> my_dict = create_dict(b) 
>>> my_dict[4] 
1 
>>> my_dict[5] 
1 
>>> my_dict[1] 
0 
>>> my_dict[7] 
3 
+0

在重複元素的情況下,這與OP的情況略有不同; OP的代碼返回首次出現的索引,並返回最後一個。 [可能這並不相關,但值得注意。] – DSM

+0

@DSM,是的,你說得對,如果所有的事件都是唯一的,我的解決方案是相同的。好點子。 – Akavall

+0

如果你反過來循環「a」,我認爲它應該恢復OP的行爲。 – DSM

1

不知道這是更具可讀性,但它確實處理那裏的多個子列表與該項目在它的情況:

def get_index(my_list, my_item): 
    indices = [i for i, sublist in enumerate(my_list) if my_item in sublist] 
    if len(indices) == 1: 
     return indices[0] 
    raise ValueError("Item not in any list or in multiple lists") 
+0

我沒有在問題中明確表示,但我更喜歡獲得第一個索引。 – zenpoy

+0

在這種情況下,您可以在一行中完成:'[我爲i,子列表枚舉(my_list)如果my_item在子列表中] [0]'儘管如果不存在IndexError, – jobby

相關問題