【问题标题】:List of unique items in a list of tuples元组列表中唯一项的列表
【发布时间】:2011-09-28 23:46:15
【问题描述】:

我有一个这样的元组列表:mylist = [(1,2,3),(6,1,1),(7,8,1),(3,4,5)]。如果我使用列表理解slist = [item for sublist in mylist for item in sublist],我可以得到slist = [1,2,3,6,1,1,7,8,1,3,4,5]

如果我只需要 slist 中的唯一元素,例如 [1,2,3,6,7,8,4,5],我应该如何修改?

【问题讨论】:

    标签: python list tuples


    【解决方案1】:

    使用set 而不是列表。

    set(slist)
    

    如果你真的需要它作为一个列表,那么你可以将它转换回一个列表:

    slist = list(set(slist))
    

    请注意,此转换不会保留元素的原始顺序。如果您需要相同的订单,您可以使用它:

    >>> result = []
    >>> seen = set()
    >>> for innerlist in mylist:
            for item in innerlist:
                if not item in seen:
                    seen.add(item)
                    result.append(item)
    >>> result
    [1, 2, 3, 6, 7, 8, 4, 5]
    

    【讨论】:

    • 我可以在这里问一个问题吗?这个操作item in seen 的复杂度是多少(在set 对象中查找)?和在dict对象中查找一样有效吗?
    • @ovgolovin:是的,它应该和 dict 一样快。
    • 在这里。 wiki.python.org/moin/TimeComplexity 复杂性看起来相同,但对于 set,他们使用了 Worst Case 术语,对于 dict,他们使用了 Amortized Worst Case 术语。我想知道为什么。
    【解决方案2】:

    您实际上可以通过使用itertools.chain.from_iterable 将结果传递给set 来简化您的第一部分,这将只保留唯一元素:

    >>> mylist = [(1,2,3),(6,1,1),(7,8,1),(3,4,5)]
    >>> import itertools
    >>> set(itertools.chain.from_iterable(mylist))
    set([1, 2, 3, 4, 5, 6, 7, 8])
    

    【讨论】:

      【解决方案3】:
      import itertools
      chain = itertools.chain(*mylist)
      print(set(chain))
      

      取自Flattening a shallow list in Python,适用于本题。

      【讨论】:

        【解决方案4】:

        你应该使用python集合http://docs.python.org/library/sets.html

        set(yourlist)
        

        它会做的伎俩

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-12
          • 1970-01-01
          • 2020-12-15
          • 1970-01-01
          • 2020-10-15
          • 2012-01-09
          • 2016-05-26
          相关资源
          最近更新 更多