代码之家  ›  专栏  ›  技术社区  ›  The.Anti.9

简单唯一非优先队列系统

  •  1
  • The.Anti.9  · 技术社区  · 16 年前

    5 回复  |  直到 16 年前
        1
  •  4
  •   Aaron Maenpaa    16 年前

    我只会使用一个集合,它不会维持秩序,但会帮助您保持唯一性:

    >>> q = set([9, 8, 7, 7, 8, 5, 4, 1])
    >>> q.pop()
    1
    >>> q.pop()
    4
    >>> q.pop()
    5
    >>> q.add(3)
    >>> q.add(3)
    >>> q.add(3)
    >>> q.add(3)
    >>> q
    set([3, 7, 8, 9]
    
        2
  •  2
  •   unwesen unwesen    16 年前

    一个非常简单的例子是将每个项目的URL填充到dict中,但作为键,而不是值。然后,仅当下一项的url不在该dict的键中时,才处理该项:

    visited = {}
    # grab next url from somewhere
    if url not in visited.keys():
      # process url
      visited[url] = 1 # or whatever, the value is unimportant
    # repeat with next url
    

    当然,您可以提高效率,但这很简单。

        3
  •  2
  •   Kamil Kisiel    16 年前

    我将使用集合和列表的组合:

    visited = set()
    to_visit = []
    
    def queue_page(url):
        if url not in visited:
            to_visit.append(url)
    
    def visit(url):
        visited.add(url)
        ... # some processing
    
        # Add all found links to the queue
        for link in links:
            queue_page(link)
    
    def page_iterator(start_url):
        visit(start_url)
        try:
            yield to_visit.pop(0)
        except IndexError:
            raise StopIteration
    
    for page in page_iterator(start):
        visit(page)
    

    当然,这是一个有点做作的示例,您可能最好以某种方式封装它,但它说明了这个概念。

        4
  •  1
  •   Devin Jeanpierre    16 年前

        5
  •  0
  •   Mike Boers    16 年前

    我将扩展list类,以便将唯一的测试代码添加到您正在使用的list的任何方法中。这可以从简单地添加 .append_unique(item) append , insert , extend __setitem__ , __setslice__ ,以在非唯一项的情况下引发异常(或保持沉默,如果您愿意)。

    class UniqueList(list):
        def append(self, item):
            if item not in self:
                list.append(self, item)