2013-09-22 114 views
2

我在列表中有一個列表。查找列表中的元素

我想查找它是否包含感興趣的項目。

For example: L=[['READ',[A,B],'2'],['WRITE',[C,D],'2']]

現在,我有一個字符串,str=READ,我要遍歷兩個列表,包括子列表來找到這樣的元素是否存在。有沒有辦法做到這一點,而不訴諸索引?

我不想使用索引,因爲不能保證列表長度保持不變。

回答

2

只要在數據stucture被搜索,這是一個簡單的遞歸問題沒有循環:

def find(x, L): 
    return x in L or any(find(x, sublist) 
         for sublist in L 
         if isinstance(sublist, list)) 

相反,如果有可能的數據結構中循環,那麼你就要警惕進入無限遞歸

def find(x, L, seen=None): 
    if seen is None: 
     seen = set() 
    if id(L) in seen: 
     # Avoid infinite recursion 
     return False 
    seen.add(id(L)) 
    return x in L or any(find(x, sublist, seen) 
         for sublist in L 
         if isinstance(sublist, list)) 
+0

如何查看元素是否在其中?它在某些字符處返回<發生器對象>'總是... –

+0

@GM:在複製函數時,您必須完成一些拼寫錯誤。他們在Python2和Python3中工作。 – 6502

+0

不,我複製並粘貼它。然後鍵入'find('A',L)'和這個返回'<發生器對象 0x10dc7ab90>' –

2

使用一個共同的平坦化作用:

import collections 
def flatten(l): 
    for el in l: 
     if isinstance(el, collections.Iterable) and not isinstance(el, basestring): 
      for sub in flatten(el): 
       yield sub 
     else: 
      yield el 

您可以拼合列表,然後檢查是否讀取它。

>>> 'READ' in flatten(L) 
True 
+0

這是一個很好的方法。但我不想使用任何複雜的東西。看看我接受的答案,那正是我想要的。 –

+0

@RohitShinde好的。 – TerryA