2010-03-09 236 views
10

我知道我在找什麼。我想Python來告訴我這是在哪一個列表Python:嵌套列表中元素的索引列表

下面是一些僞代碼:

item = "a" 

nested_list = [["a", "b"], ["c", "d"]] 

list.index(item) #obviously this doesn't work 

在這裏我想蟒蛇返回0(因爲「a」是在第一子列表中的一個元素更大的列表)。我不在乎它是哪個子元素。我不在乎是否有重複,例如[「a」,「b」,「a」]應該返回與上述示例相同的內容。

回答

1

你需要使用某種類型的循環結構:

next((sublist for sublist in mainlist if item in sublist)) 

這會給你包含所需項目的所有子列表發電機,給你的第一個。

+1

沒錯:這給子列表,而OP指定他們想要的子表的索引,正如我在回答返回。 – 2010-03-09 00:58:21

12

在Python 2.6或更好,

next((i for i, sublist in enumerate(nested_list) if "a" in sublist), -1) 

假設例如如果'a'不存在於任何子列表中,則需要-1結果。

當然,它也可以在老版本的Python中完成,但不是很容易,因爲您沒有指定您感興趣的Python版本,所以我認爲最好使用最新的基於生產的產品 - 固定的(如果您需要指定其他舊版本的Python,請編輯您的答案)。

編輯:根據要求,讓我試着解釋這是如何工作的。我使用內置函數next(特別是我打電話給next(iterator, default)):返回迭代器的下一個項目(因此第一個,因爲這是我們第一次推進該迭代器),或者迭代器完成時的默認值(如果在完成之前完成,則表示「空」;-)。默認顯然是-1,如果「a不存在於任何子列表」中,則返回-1,這意味着在這種情況下與「迭代器爲空」相同。

讓我們看看再迭代器:

(i for i, sublist in enumerate(nested_list) if "a" in sublist) 

的(四捨五入)括號內forif關鍵字,也就意味着這是一個生成器表達式,也很出名,簡潔的genexp。 i(指數)和sublist(該指數的項目)超過enumerate(nested_list) - 如果我們在這裏沒有enumerate那麼我們不會跟蹤指數,但在這種情況下,我們確實需要它。只有當if子句得到滿足時,纔會考慮它們,即當您查找的元素出現在當前子列表中時。

所以這個genexp每次產​​生一個索引的每個值,使得該索引處的子列表滿足條件"a" in sublist。由於我們在next內部使用它,我們只採用第一個這樣的索引。

這個OP可能是合理的,因爲認爲一個神奇的內建人員在三個或四個字符中完成所有這些操作會更加方便 - 因此,對於這個非常具體的要求,我相信我以前從未見過超過十年的Python使用;然而,如果每一個這樣的具體要求都有自己非常專業化的內建語言,那麼內建的語言將會長於稅法。相反,Python提供了許多低級別的「樂高積木」和一些方便的方法將它們組合在一起,以清晰(並且合理簡潔地)表達解決方案,以組合大量的各種特定需求,如OP。

+1

由於他是編程新手,你會如此善意地解釋這是如何工作的? :)不過,你有我的+1。 – 2010-03-09 01:00:53

+0

@musicfreak,當然,讓我添加一些解釋。 – 2010-03-09 01:04:53

+0

哇,很好的解釋!如果可以的話,我會給你更多的選票! – 2010-03-09 06:58:00

0

迭代列表以獲取每個子列表。然後,請檢查該項目是在子表:

for i in range(0,len(list)): 
    if whatYoureLookingFor in list[i]: 
     print i 
0
>>> nested_list = [["a", "b"], ["c", "d"]] 
>>> item="a" 
>>> for o,sublist in enumerate(nested_list): 
...  if item in sublist: 
...   print o 
... 
0