【问题标题】:Python counter - numbers not in order [duplicate]Python计数器 - 数字不按顺序[重复]
【发布时间】:2019-12-12 10:00:28
【问题描述】:

我正在尝试构建一个简单的程序来计算特定小时内文件中的条目数。我的目标是 txt 文件中时间戳的小时部分并计算每一个。这一切都很好,但是当我打印结果时,我希望它从 00、01 等到 22、23 的时间排序。

这是我的代码:

hour = []
for x in hour:
    hour.append(x[10:12]) #To get just the hour-part of the timestamp.

hour_sorted = (sorted(hour)) #Now the hours are sorted from 00 to 23, all good so far.

counts = Counter(hour_sorted)

for number in counts:
    if number in counts:
        print(number + ' ' + str(counts[number]))

问题是现在打印所有时间都乱序了。

输出示例:

    10    3
    00    2
    12    2
    21    3

等等。我想要这样:

    00    2
    10    3
    12    2
    21    3

任何想法我做错了什么?

【问题讨论】:

  • 嘿,你能指定你使用的是哪个版本的 Python 吗? collections.Counter 是一个字典对象,它的排序在 python 2 和 3 之间发生了很大变化
  • 另外,我认为for 循环中的if 条件是多余的。

标签: python


【解决方案1】:

Counter 的基础数据结构是dict。 您可以在CPython's sources 中看到这一点。 Python中的dict是一个hashmap,一般来说是一个无序的结构。 更具体地说,它不保留插入顺序。

因此,当迭代 Counter 实例的元素时,您将不会按照存储它们的顺序获取它们。

但是,从 Python 3.6 开始,dicts 是自然排序的,因此您会得到您期望的行为。 我正在运行 Python 3.7,如果我填充 hour 列表,这就是我得到的:

00 2
10 3
12 1
21 1

条目按插入顺序打印,即排序后hour的顺序。

但是,如果您运行的不是 Python 3.6 或更高版本,则必须在对 hour 进行排序后对其进行迭代,以便将排序考虑在内:

hour_sorted = (sorted(hour))
counts = Counter(hour_sorted)

for hour in hour_sorted:
    print(hour, counts[hour])

【讨论】:

  • 感谢所有帮助!我一回到家就试试这个:)
  • 不得不远程连接到我的电脑并立即尝试。当我在 python 3 中运行相同的代码时,它就像一个魅力!感谢您的快速和大力帮助!
【解决方案2】:

您需要在 for 循环之前对 Counter 对象进行排序:

...
counts  = sorted(counts.items())
...

【讨论】:

  • 感谢所有帮助!我一回到家就试试这个:)
猜你喜欢
  • 2020-04-11
  • 2011-08-31
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多