如何在嵌套列表中搜索字符串

时间:2017-05-07 00:59:52

标签: python python-3.x nested

我正在做的任务的一个问题包括查看由“超短故事及其作者”组成的嵌套列表,以查找用户输入的字符串。不确定如何解决这个问题,如果有人想要更多clarification,请参阅下面的任务简介。还有更多我不确定的问题,例如“查找某位作者的所有故事”。一些解释,或指出我正确的方向非常感谢:)

list = []
mylist = [['a','b','c'],['d','e','f']]

string = input("String?")

if string in [elem for sublist in mylist for elem in sublist] == True:
    list.append(elem)

这只是我尝试过的一个例子,上面的列表与我实际用于问题的列表相似。我目前正在通过不同的方法迭代嵌套列表并将计算项添加到另一个列表。上面的代码只是我在这个过程中尝试的一个例子。

2 个答案:

答案 0 :(得分:0)

""" the image above states that the data is in the
form of an list of sublists, with each sublist containing
two strings
"""

stories = [
    ['story string 1', 'author string 1'],
    ['story string 2', 'author string 2']
]


""" find stories that contain a given string
"""
stories_with_substring = []
substring = 'some string'  # search string

for story, author in stories:
    # if the substring is not in the story, a ValueError is raised
    try:
        story.index(substring)
        stories_with_substring.append((story, author))
    except ValueError:
        continue

""" find stories by a given author
"""
stories_by_author = []
target_author = 'first last'

for story, author in stories:
    if author == target_author:
        stories_by_author.append((story, author))

这一行

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]

我确定您在处理包含列表/元组的列表时可以看到它有多大用处。

如果您希望搜索不区分大小写,则可能需要在某些字符串上调用.lower()

答案 1 :(得分:0)

你可以在这里做一些事情。您的示例显示了列表理解的使用,因此让我们关注此问题的其他一些方面。

<强>递归

您可以定义一个迭代顶级列表中所有项目的函数。假设您确定所有项目都是字符串或更多列表,您可以使用type()检查每个项目是否是另一个列表,或者是字符串。如果它是一个字符串,请进行搜索 - 如果它是一个列表,请让您的函数自行调用。我们来看一个例子吧。请注意,我们绝不应该使用名为liststring的变量 - 这些是核心价值类型,我们不想意外覆盖它们!

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

我们在这里做了几件事:

  1. 创建名为results
  2. 的空列表
  3. 迭代my_list
  4. 的顶级项目
  5. 如果其中一个项目是另一个列表,我们自己调用函数 - 在某些时候这将触发项目列表的条件,并最终返回结果。目前,我们假设我们返回的结果是正确的,因此我们将这些结果连接到顶级results列表
  6. 如果该项目不是列表,我们只需检查输入是否存在,如果是,请将其添加到我们的结果列表中
  7. 这种递归通常非常安全,因为它本身就受到我们数据结构的限制。除非数据结构本身无限深,否则它无法永远运行。

    <强>发电机

    接下来,让我们看看python 3的更酷的功能:生成器。现在,我们一直在做所有收集结果的工作。如果我们稍后想要迭代这些结果,我们需要单独迭代它们。

    我们可以定义一个生成器,而不是这样做。实际上,这几乎与几乎相同,但不是在一个循环中收集结果然后在一秒内使用它们,我们可以在一个循环中收集和使用每个结果。发电机&#34;产量&#34;一个值,然后停止,直到下次调用它。让我们修改我们的示例,使其成为生成器:

    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
    

    你会注意到这个版本的版本要短一些。没有必要将项目保存在临时列表中 - 每个项目都是&#34;产生&#34;,这意味着它直接传递给调用者立即使用,并且调用者将停止我们的生成器直到它需要下一个值。

    yield from基本上执行相同的递归,它只是在生成器中设置一个生成器,将这些嵌套的项目返回到链接到调用者。

    这些是一些很好的尝试技巧 - 请给他们一个去!