【问题标题】:retrieve input of collections.Counter output检索集合的输入。计数器输出
【发布时间】:2018-01-18 16:02:59
【问题描述】:

不确定标题是否正确。

假设您有一个看起来像 Counter 对象的输出的列表。

[(-3.0, 4), (-2.0, 1), (-1.0, 1), (0.0, 1), (1.0, 1), (2.0, 1), (3.0, 4)]

我怎样才能回去得到原来的名单,因为

[-3.0, -3.0, -3.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 3.0, 3.0, 3.0]

【问题讨论】:

  • 顺序重要吗?还是以后可以对列表进行排序?
  • @Jean-FrançoisFabre 不。但这可能对其他人有用:)

标签: python python-3.x python-collections


【解决方案1】:
list(Counter(dict(a)).elements())

演示:

>>> from collections import Counter
>>> a = [(-3.0, 4), (-2.0, 1), (-1.0, 1), (0.0, 1), (1.0, 1), (2.0, 1), (3.0, 4)]
>>> list(Counter(dict(a)).elements())
[-3.0, -3.0, -3.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 3.0, 3.0, 3.0]

因此,如果您确实有Counter,请直接向它询问elements

【讨论】:

  • 不过是 Python 3.6+。
  • @JeffMercado 也许,也许不是。
  • 你是对的!但杰夫的意思是它不保留列表的顺序。所以它在 python [0.0, 1.0, 2.0, 3.0, 3.0, 3.0, 3.0, -1.0, -3.0, -3.0, -3.0, -3.0, -2.0]
  • 好吧,如果顺序很重要,列表可能会在之后排序,但顺序是浮动的自然顺序。
  • @Jean-FrançoisFabre 是的,我知道,但我认为是否应该“保留”订单并不清楚。我的意思是,他谈到了“原始列表”,谁从排序列表中创建了一个计数器?加上 3.6+ 它确实保留了。
【解决方案2】:

您可以使用以下嵌套推导:

lst = [(-3.0, 4), ..., (3.0, 4)]
[x for x, count in lst for _ in range(count)]
# [-3.0, -3.0, -3.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 3.0, 3.0, 3.0]

【讨论】:

    【解决方案3】:

    你可以试试这个:

    s = [(-3.0, 4), (-2.0, 1), (-1.0, 1), (0.0, 1), (1.0, 1), (2.0, 1), (3.0, 4)]
    final_s = [i for b in [[a]*b for a, b in s] for i in b]
    

    输出:

    [-3.0, -3.0, -3.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 3.0, 3.0, 3.0]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-05
      • 2019-02-07
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多