如何前进到嵌套列表中的下一项?python

如何前进到嵌套列表中的下一项?python,python,list,iteration,Python,List,Iteration,使用两个列表,对每个列表进行迭代。下面是一段代码: self.links = [] self.iter=iter(self.links) for tgt in self.links: for link in self.mal_list: print(link) if tgt == link: print("Found Suspicious Link: {0}".format(tgt)) self.count +=

使用两个列表,对每个列表进行迭代。下面是一段代码:

self.links = []
self.iter=iter(self.links)
for tgt in self.links:
    for link in self.mal_list:
        print(link)
        if tgt == link:
           print("Found Suspicious Link: {0}".format(tgt))
           self.count += 1

        else:
           self.count += 1
           self.crawl(self.iter.next())

它将前进到链接列表中的下一项,很好。对于恶意软件签名列表,我尝试使用一个类似的iter项目,但我不完全确定这是否是最好的方法,如果是这样,请将其放在我的代码中,以便在循环打开链接列表中的下一个项目之前,将从列表中打开的每个链接与恶意软件列表中的每个项目进行比较。有什么建议吗?

你做这件事的基本方法很好,但会很慢

请尝试以下方法:

 for tgt in links:
      if tgt in mal_links:
          # you know that it's a bad link
      else:
          crawl(tgt)
我不明白为什么要在列表中保留两个迭代器。这将引入一个bug,因为在检测到恶意软件链接的情况下,您不会调用self.iter上的next。下次tgt不是坏链接时,当您调用next时,它将前进到先前检测到的坏链接,您将对其进行爬网。您是否有理由认为需要跳过迭代器的两个副本而不是一个副本


此外,每次未确定页面是否等于给定的恶意软件链接时,您的初始代码都会对该页面进行一次爬网。这可能会导致一些愤怒的网络管理员,这取决于你的列表有多大。

你这样做的基本方式是好的,但会很慢

请尝试以下方法:

 for tgt in links:
      if tgt in mal_links:
          # you know that it's a bad link
      else:
          crawl(tgt)
我不明白为什么要在列表中保留两个迭代器。这将引入一个bug,因为在检测到恶意软件链接的情况下,您不会调用self.iter上的next。下次tgt不是坏链接时,当您调用next时,它将前进到先前检测到的坏链接,您将对其进行爬网。您是否有理由认为需要跳过迭代器的两个副本而不是一个副本


此外,每次未确定页面是否等于给定的恶意软件链接时,您的初始代码都会对该页面进行一次爬网。这可能会导致一些愤怒的网站管理员,具体取决于你的列表有多大。

不确定你想问什么,但你可以简化你的代码。虽然这不是必须的

self.links = []
self.non_malware_link = [link for link in self.links if link not in self.mal_list]
results = map(self.crawl, self.non_malware_link)
关于代码的一些问题:

self.count与lenself.links完全相同
除了self.count的含义外,其他每件事情看起来都像是它做了它需要做的事情。

不确定您想问什么,但您可以简化代码。虽然这不是必须的

self.links = []
self.non_malware_link = [link for link in self.links if link not in self.mal_list]
results = map(self.crawl, self.non_malware_link)
关于代码的一些问题:

self.count与lenself.links完全相同
除了self.count的含义外,其他每件事情看起来都像是在做它需要做的事情。

在列表中搜索一个项目很慢,如果这是您正在尝试做的事情,那么使用dict或set而不是list来搜索self.malu列表:

或者,如果还可以设置self.links:

mal_list = set(self.mal_list)
links = set(self.links)
detected = links.intersection(mal_list)
for malware in detected:
    print("Found Suspicious Link: {0}".format(tgt))
    self.count += 1

在列表中搜索项目的速度很慢,如果您正试图这样做,请使用dict或set而不是list来搜索self.malu列表:

或者,如果还可以设置self.links:

mal_list = set(self.mal_list)
links = set(self.links)
detected = links.intersection(mal_list)
for malware in detected:
    print("Found Suspicious Link: {0}".format(tgt))
    self.count += 1


我假设他将使用self.count通知用户当前的扫描进度?@Lie-Ryan:谢谢,太好了@Stev0:@Lie Ryan:谁投过我的票。我的答案留在这里供参考,但我发现Lie Ryan的答案与使用集合删除不必要的重复比较一样优雅。我投票支持他的答案。请看一看。aaronasterling的建议也很有道理。我假设他将使用self.count通知用户当前的扫描进度?@Lie Ryan:谢谢,太好了@Stev0:@Lie Ryan:谁投过我的票。我的答案留在这里供参考,但我发现Lie Ryan的答案与使用集合删除不必要的重复比较一样优雅。我投票支持他的答案。请看一看。aaronasterling的建议也很有意义。关于使用集合的想法很好,但是,在跨过两个版本的链接时,您已经从OP的原始代码中继承了一个错误。感谢集合的信息,我可以做些什么来加速它是很好的。关于使用集合的想法很好,但是,跨过两个版本的链接时,您已经从OP的原始代码中继承了一个bug。感谢您提供的关于集合的信息,我能做些什么来加速它是非常好的。@aaronasterling:+1捕捉到这个bug真是太好了!!我制作了一个self.iter,因为当调用crawltgt时,它会一遍又一遍地抓取链接列表中的第一项。我理解你在这里关于删除第二个for循环的内容,在考虑了它所做的事情之后,这使方法更有意义,但是我现在只剩下最初的问题,即它没有推进项目。iter是解决这一问题的最佳方式吗,并确保我调用。在if-else语句的两个模块中,下一个是?@Stev0:这将是你爬行过程中的一个bug;你最好还是在那里修好它。@Lie Ryan:怎么会这样?tgt是列表中的第一项,通过调用crawltgt,我只需将它迭代的第一项传递给它。我是否应该移动。下一步是爬网功能的开始?@Stev0:self.crawlink-shou
ld只需收集单个页面中包含的链接,并将其放在某个地方供将来检查;self.crawl不应该调用你的恶意软件检查函数。@aaronastering:+1很好地捕捉到了这个bug!!我制作了一个self.iter,因为当调用crawltgt时,它会一遍又一遍地抓取链接列表中的第一项。我理解你在这里关于删除第二个for循环的内容,在考虑了它所做的事情之后,这使方法更有意义,但是我现在只剩下最初的问题,即它没有推进项目。iter是解决这一问题的最佳方式吗,并确保我调用。在if-else语句的两个模块中,下一个是?@Stev0:这将是你爬行过程中的一个bug;你最好还是在那里修好它。@Lie Ryan:怎么会这样?tgt是列表中的第一项,通过调用crawltgt,我只需将它迭代的第一项传递给它。我是否应该移动。下一步是爬网功能的开始?@Stev0:self.crawdlink应该只收集单个页面中包含的链接,并将其放在某个地方以备将来检查;self.crawl不应调用您的恶意软件检查功能。