我想深入搜索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