在列表中查找通用子列表

时间:2016-09-12 23:42:46

标签: python regex list recursion

只是学习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]"

我知道我可以将整个事物转换成字符串并解析它,但这似乎不是一个非常优雅或有效的解决方案。谢谢!

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