在列表列表中搜索障碍?
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
>>>
我正在编写一个函数,当给定一个列表列表时,它可以确定特定的第一个字符后跟特定的第二个字符(一次或重复)还是另一个随机字符串。当存在另一个随机字符串时,该函数应 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
>>>