在列表列表中搜索障碍物?

时间:2016-10-31 01:41:29

标签: python list character continue

我正在编写一个函数,当给出一个列表列表时,它可以确定特定的第一个字符后面是否是特定的第二个字符(一次或重复),或者后面是另一个随机字符串。当存在另一个随机字符串时,该函数应该返回False,但是当没有随机字符串时,该函数应该返回True。

基本上,如果.以外的任何其他字符出现在当前列表中的B之后或任何后续列表中,那么它应该返回False,但如果只有.,则它应该返回True 。

例如,如果第一个字符为B且第二个字符为.且列表列表为[['.','.','B','.'],['.','.','.','.']],则它应返回True但如果列表列表是[['a','c','B','r'],['.','s','g','h']]它应该返回False,因为一系列随机字符串跟在B之后。

任何提示或帮助都将被理解这是我到目前为止的代码:

def free_of_obstacles(lst):
    A = 'B'
    B = '.'
    for i, v in enumerate(lst):
            if A in v:
                continue
            if B in v:
                continue
                return True
            else: 
                return False

1 个答案:

答案 0 :(得分:0)

您可以加入每个列表中的所有字符,并将所有连接的字符串连接到一个字符串中,然后应用正则表达式来检查是否匹配:

>>> lst=[['.','.','B','.'],['.','.','.','.']]
>>> import re
>>> bool(re.search(r'B(\.+)$', ''.join(''.join(i) for i in lst)))
True
>>> lst=[['a','c','B','r'],['.','s','g','h']]
>>> bool(re.search(r'B(\.+)$', ''.join(''.join(i) for i in lst)))
False
>>> 

编辑1 ----> 以上解决方案作为返回True或False的函数:

>>> import re
>>> def free_of_obstacles(lst):
...     return bool(re.search(r'B(\.+)$', ''.join(''.join(i) for i in lst)))
... 
>>> lst=[['a','c','B','r'],['.','s','g','h']]
>>> free_of_obstacles(lst)
False
>>> lst=[['.','.','B','.'],['.','.','.','.']]
>>> free_of_obstacles(lst)
True

不使用任何导入的模块:

示例运行1

>>> lst=[['.','.','B','.'],['.','.','.','.']]
>>> newlst=[j for i in lst for j in i]
>>> newlst=newlst[newlst.index('B')+1:]
>>> newlst
['.', '.', '.', '.', '.']
>>> list(map(lambda x:x=='.', newlst))
[True, True, True, True, True]
>>> all(list(map(lambda x:x=='.', newlst)))
True

示例运行2

>>> lst=[['a','c','B','r'],['.','s','g','h']]
>>> newlst=[j for i in lst for j in i]
>>> newlst=newlst[newlst.index('B')+1:]
>>> newlst
['r', '.', 's', 'g', 'h']
>>> list(map(lambda x:x=='.', newlst))
[False, True, False, False, False]
>>> all(list(map(lambda x:x=='.', newlst)))
False

编辑2 ----> 以上解决方案作为返回True或False的函数:

>>> def free_of_obstacles(lst):
...     newlst=[j for i in lst for j in i]
...     newlst=newlst[newlst.index('B')+1:]
...     return all(list(map(lambda x:x=='.', newlst)))
... 
>>> lst=[['.','.','B','.'],['.','.','.','.']]
>>> free_of_obstacles(lst)
True
>>> lst=[['a','c','B','r'],['.','s','g','h']]
>>> free_of_obstacles(lst)
False
>>>