在列表列表中搜索障碍?

Searching for obstacles in list of lists?

我正在编写一个函数,当给定一个列表列表时,它可以确定特定的第一个字符后跟特定的第二个字符(一次或重复)还是另一个随机字符串。当存在另一个随机字符串时,该函数应 return False 但当不存在随机字符串时,该函数应 return True.

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

例如,如果第一个字符是 B,第二个字符是 .,列表的列表是 [['.','.','B','.'],['.','.','.','.']] 那么它应该 return True 但如果列表列表是 [['a','c','B','r'],['.','s','g','h']] 它应该 return 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

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

>>> 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
>>> 

EDIT 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

EDIT 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
>>>