Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在嵌套列表中搜索字符串_Python_Python 3.x_Nested - Fatal编程技术网

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
    列表
  • 如果项目不是列表,我们只需检查输入是否存在,如果存在,则将其添加到结果列表中
  • 这种递归通常是非常安全的,因为它本质上受到数据结构的限制。除非数据结构本身是无限深的,否则它无法永远运行

    发电机

    接下来,让我们看看python 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
    基本上执行相同的递归,它只是在生成器中设置一个生成器,将这些嵌套项返回到调用方的链中


    这些都是值得尝试的好方法-请尝试一下

    你能给出一个简单的数据结构示例吗?到目前为止,您尝试了什么-您是否有任何示例代码可以显示您遇到的问题?我们不是在为您做作业,至少可以向我们展示您做了什么。您可以添加一些关于您正在做什么以及为什么要做的解释吗?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