【问题标题】:How to keep unique items from a collection of similar items in a list? [duplicate]如何从列表中的相似项目集合中保留唯一项目? [复制]
【发布时间】:2019-10-01 08:09:55
【问题描述】:

我有一个类似下面的列表

a = [5,5,5,5,3,3,2,2,2,2,5,5,5,2,2,2,2,2]

我希望有以下输出列表

b = [5,3,2,5,2]

请注意,我已尝试使用

list(OrderedDict.fromkeys(a))

这给了我

[5, 3, 2]

请注意,它不考虑第 2 个 5 或第 2 个 2,因为那时它们是非唯一的。

我需要一种方法让机器理解当它遇到一个唯一元素(比如第一个“5”)时,它应该将它存储在列表 b 中。因此,当它遇到第一个“3”或第一个“2”时,它也应该将它们存储在列表 b 中。到目前为止没有问题。当它遇到第二组 '5' 时,它应该将该 5 作为新元素存储在列表 b 中。第二组 2 也是如此。

有没有 Pythonic 的方式来做到这一点?

【问题讨论】:

    标签: python python-3.x list


    【解决方案1】:

    除了执行 for 循环之外,您还可以使用 itertools groupby:

    import itertools
    
    a = [5,5,5,5,3,3,2,2,2,2,5,5,5,2,2,2,2,2]
    b = [x[0] for x in itertools.groupby(a)]  # [5, 3, 2, 5, 2]
    

    可在此处找到相关文档:https://docs.python.org/3/library/itertools.html#itertools.groupby

    编辑:一些澄清。文档中的本段解释了能够计算列表中重复出现的原因(强调我的):

    groupby() 的操作类似于 Unix 中的 uniq 过滤器。它 每次 key 的值生成一个 break 或 新组 功能变化 [...]

    【讨论】:

      【解决方案2】:

      你不用任何迭代器就可以解决这个问题,使用列表综合

      a = [5,5,5,5,3,3,2,2,2,2,5,5,5,2,2,2,2,2]
      b = [a[i] for i in range(len(a)) if a[i]! = a[i-1]]
      Print(b)
      Output is b = [5,3,2,5,2]
      

      【讨论】:

      • 这在最后一位与第一位相同的情况下不起作用。
      猜你喜欢
      • 2011-07-19
      • 2011-10-19
      • 1970-01-01
      • 2020-01-02
      • 2014-01-24
      • 2012-07-26
      • 1970-01-01
      • 2019-03-22
      • 2010-11-26
      相关资源
      最近更新 更多