Python 如何在嵌套列表中搜索字符串
我正在做的作业中的一个问题是在一个嵌套列表中查找“一个超短故事及其作者”,以查找用户输入的字符串。不确定如何进行,如果有人想要更多,下面是作业简介。还有更多我不确定的问题,例如“查找某个作者的所有故事”。一些解释,或者给我指出正确的方向,我非常感激:) 这只是我尝试过的一个例子,上面的列表与我实际用于这个问题的列表非常相似。我目前正在研究迭代嵌套列表和向另一个列表添加匹配项的不同方法。上面的代码只是我在此过程中所做尝试的一个示例。Python 如何在嵌套列表中搜索字符串,python,python-3.x,nested,Python,Python 3.x,Nested,我正在做的作业中的一个问题是在一个嵌套列表中查找“一个超短故事及其作者”,以查找用户输入的字符串。不确定如何进行,如果有人想要更多,下面是作业简介。还有更多我不确定的问题,例如“查找某个作者的所有故事”。一些解释,或者给我指出正确的方向,我非常感激:) 这只是我尝试过的一个例子,上面的列表与我实际用于这个问题的列表非常相似。我目前正在研究迭代嵌套列表和向另一个列表添加匹配项的不同方法。上面的代码只是我在此过程中所做尝试的一个示例。“”“上面的图像表明数据在 子列表的形式,每个子列表包含 两条线
“”“上面的图像表明数据在
子列表的形式,每个子列表包含
两条线
"""
故事=[
[‘故事串1’、‘作者串1’],
[‘故事串2’、‘作者串2’]
]
“”“查找包含给定字符串的故事”
"""
带有子字符串=[]的故事
substring='some string'#搜索字符串
对于故事,故事中的作者:
#如果子字符串不在故事中,则会引发ValueError
尝试:
故事索引(子字符串)
带有子字符串的故事。\u.append((故事,作者))
除值错误外:
持续
“”“查找给定作者的故事
"""
作者的故事=[]
target_author='first-last'
对于故事,故事中的作者:
如果作者==目标作者:
作者的故事。附加((故事,作者))
这条线在这里
for story, author in stories:
“解包”数组。相当于
for pair in stories:
story = pair[0]
author = pair[1]
或者更进一步:
i = 0
while i < len(stories):
pair = stories[i]
story = pair[0]
author = pair[1]
i=0
而我(故事):
配对=故事[i]
故事=成对[0]
作者=对[1]
我相信您可以看到这在处理包含列表/元组的列表时是多么有用
如果希望搜索不区分大小写,可能需要对某些字符串调用
.lower()
,您可以在此处执行一些操作。您的示例演示了列表理解的使用,因此让我们关注这个问题的其他一些方面
递归
您可以定义一个迭代顶级列表中所有项的函数。假设您确定所有项目都是字符串或多个列表,则可以使用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
我们在这里做了几件事:
results
my_列表的顶级项
results
列表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
基本上执行相同的递归,它只是在生成器中设置一个生成器,将这些嵌套项返回到调用方的链中
这些都是值得尝试的好方法-请尝试一下 你能给出一个简单的数据结构示例吗?到目前为止,您尝试了什么-您是否有任何示例代码可以显示您遇到的问题?我们不是在为您做作业,至少可以向我们展示您做了什么。您可以添加一些关于您正在做什么以及为什么要做的解释吗?Op希望了解如何做到这一点,而不是简单地为他们编写代码。这对我来说很有意义,但是我在打印附加故事列表时遇到了一些问题,当我打印带有子字符串的故事时,它看起来是这样的:[(‘尸体零件丢失。医生买游艇,’Margaret Atwood')][(‘尸体缺了,医生买了游艇’,‘玛格丽特·阿特伍德’,(‘小明星性丑闻,涉及巨型鱿鱼’,‘玛格丽特·阿特伍德’)]对不起,也是stack overflow的新手,不知道如何把东西贴得很好。你是不是在打电话给《打印》(故事,带子串)?那不行。你需要以构建列表的相同方式循环列表,并单独打印每个元素。看起来效果很好,我会再测试一次。谢谢你。谢谢:)我会尝试这些方法,让你知道它们对我有何作用。嗨,戴夫,我想知道你有什么建议吗
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