【问题标题】:Python convert Counter object into list of ordinalsPython将Counter对象转换为序数列表
【发布时间】:2021-05-31 11:48:32
【问题描述】:

我认为这应该有一个比较简单的解决方案。

我有一个 Counter 对象,我想从中创建一个由整数组成的列表,这些整数表示 Counter 对象中每个键的序数值。

说明我的意思:

假设这是我的计数器对象 -

Counter(elems)

Counter({'elem1': 13,
         'elem2': 13})

由此,我想生成以下类型的“序数”列表:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

我尝试了一些方法,例如:

ord_list = [i for i in range(1, v + 1) for k, v in Counter(elems).items()]

但我一直得到的最接近的是[1, 1, 2, 2, 3, 3, 4, 4..., 13, 13],而不是我正在寻找的。​​p>

我错过了什么明显的东西?谢谢大家。

【问题讨论】:

  • 我不确定我明白你想要什么? [i for i in range(max(Counter(sesh_subj).values())+1)] 会吗?序数列表与Counter 有何关系?
  • 对不起,首先,“sesh_subj”部分是一个复制和粘贴错误,我已对其进行了编辑以使事情更清楚。我不能使用“max”,因为尽管我给出的插图中是这种情况,但 Counter 对象中的元素并不总是具有相同的计数值。

标签: python list counter


【解决方案1】:

这是你需要的:

elems = {'elem1': 13, 'elem2': 13}
ord_list = [i for k, v in Counter(elems).items() for i in range(1, v + 1)]
print(ord_list)

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

【讨论】:

  • 迭代items 是没有意义的,因为你不需要k。只需遍历values
  • 我只是试图修复他的代码,而不是提供一个新的解决方案,以便他可以轻松地遵循他正在做的事情。他甚至可以将.items() 更改为.values(),而不是只获取值。
  • 这正是我的建议,不确定我是否理解您评论中的“他甚至可以”部分......
  • 我的意思是他应该更容易理解和理解他首先拥有的东西,然后他可以通过将.items()更改为.values()优化他的代码甚至想出一个更好的解决方案。
  • 好的。我已将变量名称更新为 elems ;)
【解决方案2】:

您缺少第二个循环,它将将每个范围中的每个单独的数字添加到外部列表中。另外,请记住,不需要遍历 items,因为您不会在任何地方使用密钥,因此只需遍历 values

d = {'elem1': 13,
     'elem2': 13}

print([num for v in d.values() for num in range(1, v + 1)])

或者您可以使用itertools.chain 来展平子列表,在我看来,这是一个更长但更具可读性/描述性的解决方案:

from itertools import chain

d = {'elem1': 13,
     'elem2': 13}

print(list(chain.from_iterable(range(1, v + 1) for v in d.values()))) 

【讨论】:

  • 感谢这两个解决方案。我对 itertools 不太熟悉,但我想这可能是我改变它的触发因素。
猜你喜欢
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多