只是学习Python作为我的第一个编码语言。给定一个包含许多可能的子列表的列表,这些子列表具有可变数量的元素,是否有一种方法可以使用正则表达式(或类似的东西)来识别哪些列表包含子列表,其中1)指定的元素数量和2)给定的按特定顺序(包括其他子列表)的内容类型?例如(伪代码):
list1 = [1, 4, 7, ["a", 5, "b"], 2, 4,7,"k",9]
list2 = [1, 4, 7, ["a", "h", "b"], 2]
list3 = [1, 4, 7, ["a", ["a", 6, "b"], "b"], 5, 3]
list4 = [1, 4, 7, ["a", "b"], 3, 4]
list5 = [1, 4, 7, ["a", 5, "b", 7], 3, 4]
if ["a", ., "b"] in listx: # where "." stands for anything, even sub-lists
print("yes")
else:
print("no")
list1,list2和list3应打印"是",但list4和list5应打印" no"。
作为奖励,有没有办法返回1)找到指定的通用子列表的次数和2)在哪里?例如,让list3返回"有2个[" a",。," b"]子列表,它们是list3 [3]和list3 [3] [ 1]"
我知道我可以将整个事物转换成字符串并解析它,但这似乎不是一个非常优雅或有效的解决方案。谢谢!
答案 0 :(得分:3)
我同意转换为字符串在这里没有任何意义,但正则表达式显式搜索字符串,因此您也不会寻找它。您正在寻找一种测试规则的递归解决方案,这些解决方案(基本上)是
somelist IS或CONTAINS一个以字符串" a"开头的列表,以字符串" b"结尾,并且有三个或更多元素。
将其编入:
def flat_pass(lst):
return len(lst) >= 3 and lst[0] == 'a' and lst[-1] == 'b'
现在你只需要递归(赶上" CONTAINS"以上规则的一部分)
def recurse_pass(lst):
if len(lst) >= 3 and lst[0] == 'a' and lst[-1] == 'b':
# base case
return True
# otherwise, flow continues...
for el in lst:
if isinstance(el, list):
# recursive case
if recurse_pass(el):
return True
return False