如何前进到嵌套列表中的下一个项目?蟒蛇

时间:2010-10-29 07:06:51

标签: 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 += 1

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

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

3 个答案:

答案 0 :(得分:2)

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

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)

关于代码的一些问题:

  1. self.count与len(self.links)
  2. 完全相同

    除了self.count的含义之外,其他所有东西看起来都像它需要做的那样。

答案 1 :(得分:1)

你这样做的基本方法很好,但速度很慢。

请改为尝试:

 for tgt in links:
      if tgt in mal_links:
          # you know that it's a bad link
      else:
          crawl(tgt)

我不明白你为什么要让两个迭代器越过列表。这将引入一个错误,因为如果您检测到恶意软件链接,则不会在next上调用self.iter。下次tgt不是错误链接时,当您拨打next时,它会前进到先前检测到的错误链接,您将抓取该链接。是否有一些理由认为需要跨过两个迭代器副本而不是一个?

此外,每次确定不等于给定的恶意软件链接时,您的初始代码将抓取一次页面。这可能会导致一些愤怒的网站管理员,这取决于你的列表有多大。

答案 2 :(得分:1)

搜索列表中的项目的速度很慢,如果这是您要执行的操作,请使用dictset代替list {{1} }}:

self.mal_list

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

mal_list = set(self.mal_list)
for tgt in self.links:
    if tgt in mal_list: 
        print("Found Suspicious Link: {0}".format(tgt))
        self.count += 1
    else:
        self.count += 1
        self.crawl(self.iter.next())