我想深入搜索Python中的列表。例如,我想知道5是否在my_list
或不。如何深入搜索Python列表?
my_list = [2, [3, 4, [2, 3]], 1, [4, [5]]]
我該怎麼做?做這件事
我想深入搜索Python中的列表。例如,我想知道5是否在my_list
或不。如何深入搜索Python列表?
my_list = [2, [3, 4, [2, 3]], 1, [4, [5]]]
我該怎麼做?做這件事
如果你有一個列表的列表,你可以使用這種方法
>>> l = [[1,2,3],[4,5,6], [7], [8,9]]
>>> [item for sublist in l for item in sublist]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> 5 in [item for sublist in l for item in sublist]
True
它首先使用O(n)對列表進行平滑並對其進行搜索。
如果您的列表看起來像你的榜樣,我想不出其他辦法 做得比使用for循環...
方式一:
def deapSearch(searchElement, searchList):
for element in searchList:
if element == searchElement:
return True
elif type(element) == type(list):
found = deapSearch(searchElement, element)
if found:
return found
return False
deapSearch(5, my_list)
True
deapSearch(4, my_list)
True
不漂亮,但工作。
不知道聯繫方式和巢的多層次要做到這一點,但遞歸算法這樣會做的伎倆:
def nestedSearch(nested, v):
for element in nested:
if isinstance(element, list):
if nestedSearch(element, v):
return True
elif element == v:
return True
return False
您也可以看看這個壓扁多嵌套列表:
您可以組合flatten
function(認爲它作爲一個遞歸版本的itertools.chain
)與Python的標準in
運營商(其中,在發電機,做了線性搜索)得到這個:
>>> def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
>>> my_list = [2, [3, 4, [2, 3]], 1, [4, [5]]]
>>> 5 in flatten(my_list)
True
每在鏈接的問題的意見,你將要細化flatten
代碼,如果你」重新搜索是可迭代的 - 例如,元組將會b e就像列表一樣展開搜索,並搜索字符串遞歸,直到達到Python的棧限制。
如果你只有一個嵌套列表與整數或字符,要解決這個問題的一個方法是創建無所有不必要的元素的列表(沒有「[」,「]」 ...):
咱就說我們有一個嵌套列表與字符:
>>> nested = [[[[['F', 'B'], 'G'], ['D', 'A']], 'C'], 'E']
>>> string = str(nested)
>>> string = string.replace('[','',len(string))
>>> string = string.replace(']','',len(string))
>>> string = string.replace("'","",len(string))
>>> string = string.replace(" ","",len(string))
>>> string = string.split(',')
它給:
>>> print (string)
['F', 'B', 'G', 'D', 'A', 'C', 'E']
現在,您可以輕鬆地搜索沒有任何循環:
>>> 'F' in string
True
必須考慮的一件事情是,整數嵌套列表在內存中比單純的字符串更昂貴,而遞歸函數並不是處理這種由於迭代深度的限制,使用Python的一個很大的優勢就是你可以在字符串中搜索,就像你在str([1,[2,15]])中搜索列表 – 2014-11-19 13:21:53
我最近需要做到這一點,需要一個簡單的解決方案。所以我把它作爲一個快速和骯髒的方式來加入/搜索一個列表(可能不是一個完美的解決方案,但它爲我工作)。
>>> my_list = [2, [3, 4, [2, 3]], 1, [4, [5]]]
>>> str(5) in str(my_list) # returns True
>>> str(my_list).find(str(5)) # returns the index
編輯:也添加一個正則表達式的解決方案。但是如果你有更復雜的情況,那麼你可能會遍歷列表。
>>> import re
>>> str(5) in re.findall('(?<=[,\[])([ a-zA-Z0-9 ]+)(?=[,\]])', str(my_list))
正則表達式基本上使列表平整,但不適用於列表項中的特殊字符。
'str(5) => True'你的方法是錯誤的,你至少需要一個正則表達式。 – 2017-04-06 20:12:30
這隻適用於平坦的列表的一個級別,並且每個元素保證也是可迭代的,而不是可能的搜索匹配。在這種情況下,'itertools.chain.from_iterable(l)'中的5可能比列表理解更清晰一些,並且速度肯定快一些(因爲它不會構建僅用於一個單一列表的整個列表搜索)。 – lvc 2013-03-08 12:16:39
這就是我所說的(或打算說:-)請參閱http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python – 2013-03-08 12:33:20
注意對這個問題的接受答案的評論聲稱'list(itertools.chain.from_iterable(l)'比列表解析更快,事實上你並不需要*列表來做搜索(' in'在任何迭代中都可以正常工作)僅有的化合物 – lvc 2013-03-08 12:48:01