你可以在这里做一些事情。你的例子显示了使用列表理解,所以我们来关注这个问题的其他方面。
递归
您可以定义一个函数,通过在顶级列表中的所有项目进行迭代。假设您确实知道所有项目都是字符串或更多列表,您可以使用type()
来检查每个项目是否是另一个列表,或者是一个字符串。如果它是一个字符串,请进行搜索 - 如果它是一个列表,请自己调用函数。我们来看一个例子。请注意,我们绝不应该使用名为list
或string
的变量 - 这些是核心值类型,我们不希望意外覆盖它们!
mylist = [['a','b','c'],['d','e','f']]
def find_nested_items(my_list, my_input):
results = []
for i in mylist:
if type(i) == list:
items = find_nested_items(i, my_input)
results += items
elif my_input in i:
results.append(i)
return results
我们在这里做了几件事情:
- 创建通过
my_list
- 顶级项目命名
results
- 遍历一个空的列表。如果这些项目中的一个是另一个列表,我们有我们自己的函数调用 - 在某些时候,这将触发条件,其中一个项目是而不是列表,并且最终将返回结果。现在,我们假设我们正在找回的结果将是正确的,所以我们串接这些结果给我们的顶级
results
列表
- 如果该项目不在列表中,我们简单地检查我们的输入的存在和如果是这样,请将其添加到我们的结果列表中
这种递归通常非常安全,因为它本身受到我们数据结构的限制。它不能永远运行,除非数据结构本身无限深。
发电机
接下来,让我们来看看蟒蛇3个更酷的功能:发电机。现在,我们正在做一切收集结果的工作。如果我们稍后想要遍历这些结果,我们需要分别对它们进行迭代。
而是这样做的,我们可以定义一个发电机。这几乎可以工作几乎与一样,但实际上,不是在一个循环中收集结果,然后在第二个循环中使用它们,我们可以在一个循环内收集和使用每个结果。生成器“产生”一个值,然后停止,直到下一次被调用。让我们修改我们的示例,使其成为发电机:
mylist = [['a','b','c'],['d','e','f']]
def find_nested_items(my_list, my_input):
for i in mylist:
if type(i) == list:
yield from find_nested_items(i, my_input)
elif my_input in i:
yield i
您会注意到此版本稍短。不需要在临时列表中保存项目 - 每个项目都是“生成”的,这意味着它直接传递给调用者立即使用,调用者将停止我们的生成器直到它需要下一个值。
yield from
基本上做了同样的递归,它只是在生成器中设置一个生成器来将这些嵌套的项目返回给调用者。
这些都是一些很好的技术来尝试 - 请给他们一个去!
你能给一个简单的例子数据结构吗?你到目前为止试过了什么 - 你有没有任何示例代码可以显示你卡在哪里? – daveruinseverything
我们不会为你做功课,至少告诉我们你做了什么。 –