【问题标题】:Ordering by frequency rather than alphabetically in a set (in Python)在集合中按频率而不是按字母顺序排序(在 Python 中)
【发布时间】:2015-03-18 09:08:06
【问题描述】:

我正在查看 Python 库中的一个示例,其中一个单词在列表中出现的总次数按其在字典中的频率计数排序:

cnt = Counter()
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
    cnt[word] += 1

cnt 的输出,其中元素按频率计数顺序列出:

Counter({'blue': 3, 'red': 2, 'green': 1})

我想创建一个不包括数字频率的集合,但保留列出元素的顺序:

{'blue', 'red', 'green'}

但是在我试图实现这一点的过程中:

set(word for word, count in cnt.most_common(3))

我收到一个集合,其中元素按字母顺序而不是频率计数:

{'blue', 'green', 'red'}

是否可以按频次排序?

【问题讨论】:

  • 集合没有排序,根本。如果你确实得到了字母排序,那么你下次不能依赖它是字母排序。

标签: python python-3.x set counter


【解决方案1】:

集合是唯一元素的无序集合,因此对它们进行排序没有任何意义。

您可能想要一个列表, 是有序的。下面使用list comprehension 来构造键列表。

我们可以遍历Counter.most_common(),它会按顺序返回一系列(key, value) 元组。

from collections import Counter

c = Counter({'blue': 3, 'red': 2, 'green': 1})

keys = [key for key, val in c.most_common()]

print(keys)
# ['blue', 'red', 'green']

【讨论】:

  • 为什么要重新发明轮子? [w for w,n in c.most_common()]
  • 我突然想到most_common 由于某种原因默认没有返回所有元素-_- 无论如何都已修复,谢谢@tobias_k
猜你喜欢
  • 2021-12-18
  • 2020-02-06
  • 1970-01-01
  • 2020-10-12
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 2011-03-30
相关资源
最近更新 更多