2017-05-07 59 views
0

我正在做的一个任务的问题之一是在一个由“超短故事及其作者”组成的嵌套列表中查找,以找到一个由用户。如果有人想要更多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) 

这仅仅是我试过的东西例如,上面的列表是我实际使用了一个非常相似题。我刚刚通过迭代嵌套列表的不同方法并将mathcing项目添加到另一个列表。上面的代码只是我在这个过程中所做的一个尝试的一个例子。

+1

你能给一个简单的例子数据结构吗?你到目前为止试过了什么 - 你有没有任何示例代码可以显示你卡在哪里? – daveruinseverything

+1

我们不会为你做功课,至少告诉我们你做了什么。 –

回答

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()如果你希望搜索不区分大小写

+0

你可以添加一些关于你在做什么的解释,为什么? op是希望了解如何做到这一点,而不是简单地为他们 – daveruinseverything

+0

编写的代码这对我来说很有意义,但是我在尝试打印追加故事的列表时的一些问题,当我打印stories_with_substring它看起来像这样:[(“尸体零件缺少医生购买游艇。”,“玛格丽特·阿特伍德”)] [('小明星绯闻巨型鱿鱼(“玛格丽特·阿特伍德”尸零件缺少医生购买游艇。')。 ','玛格丽特阿特伍德')]对不起也堆栈溢出新不知道如何发布很好 –

+0

你只是调用'print(stories_with_substring)'?这是行不通的。你需要循环在他们的构造相同的方式列表,并分别打印每个元素 –

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. 创建通过my_list
  2. 顶级项目命名results
  3. 遍历一个空的列表。如果这些项目中的一个是另一个列表,我们有我们自己的函数调用 - 在某些时候,这将触发条件,其中一个项目是而不是列表,并且最终将返回结果。现在,我们假设我们正在找回的结果将是正确的,所以我们串接这些结果给我们的顶级results列表
  4. 如果该项目不在列表中,我们简单地检查我们的输入的存在和如果是这样,请将其添加到我们的结果列表中

这种递归通常非常安全,因为它本身受到我们数据结构的限制。它不能永远运行,除非数据结构本身无限深。

发电机

接下来,让我们来看看蟒蛇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基本上做了同样的递归,它只是在生成器中设置一个生成器来将这些嵌套的项目返回给调用者。

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

+0

非常感谢你:)我会尝试这些方法,让你知道如何他们为我工作 –

+0

嗨戴夫我想知道如果你有任何提示如何显示故事和电影像“短篇小说.....”,然后underneather稍微idenented“ - 作者”,而不仅仅是为X在stories_with_substring中:print x就像列表一样打印出来,欢呼声 –