【问题标题】:Python dictionary counter positions changePython字典计数器位置变化
【发布时间】:2018-07-31 04:07:08
【问题描述】:

所以我试图计算文本文件中重复次数最多的值。通过使用Counter 方法,它准确地返回我正在寻找的内容

文件.txt

12334
99965
99965
44144
99965
00000
44144

script.py

pArray=[]
with open("file.txt") as my_file:
        for line in my_file:
             pArray.append((line.split('\n'))[0])
        dictn = Counter(pArray)
        print(dictn)
        for key, value in dictn.items():
                print("KEY",key)    
                print("VALUE",value)
        print(dictn)

输出

Counter({'99965': 3, '44144': 2, '12334': 1, '00000': 1})
KEY 12334
VALUE 1
KEY 99965
VALUE 3
KEY 44144
VALUE 2
KEY 00000
VALUE 1
['12334', '99965', '44144', '00000']

但是如你所见,最终数组的输出顺序与字典的顺序不同
value 应该是降序排列)

我期待这样的输出

 ['99965', '44144', '12334', '00000']

我也试过list(dictn.keys()),但我得到了相同的输出:/
为什么订单会发生变化,我该如何解决?

【问题讨论】:

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


【解决方案1】:

the docs,我们看到Counter 对象:是“无序集合”——很像dictionaries,(实际上它们是一个子类)。所以这意味着迭代 .items() 不会按大小顺序给出元素。

然而,我们可以简单地使用.most_common,它返回一个元组列表——每个元组都包含一个元素及其计数。最重要的是井井有条。

所以我们需要做的就是使用list-comprehension 来提取返回的list 中每个tuple 的第一个元素。这可以通过以下方式完成:

[t[0] for t in dictn.most_common()]

给了:

['99965', '44144', '12334', '00000']

但也可以给出以下内容,因为 '12334''00000' 的计数相同。由于字典(和计数器)工作方式的性质,这是不可避免的。但如果这很重要,请告诉我,我可以更新答案。

['99965', '44144', '00000', '12334']

请注意,并非所有代码都需要在with 语句中,一旦创建了pArray,就可以退出with 语句。此外,基本 Python 使用 lists不是 arrays!

【讨论】:

  • 拥有相同的值不会成为问题。谢谢,这很好用!
【解决方案2】:

如果你想打印KeyValue对你可以做

for key in reversed(sorted(dictn)):
    print("KEY: {0}, VALUE: {1}".format(key, dictn[key]))

【讨论】:

  • 确实如此,python 字典默认检索键,这与循环中的 dictn.keys() 完全相同。尽管如此,如果将排序考虑到每个项目的值,那么是的,该代码是不正确的。
猜你喜欢
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 2015-08-18
  • 2015-04-08
相关资源
最近更新 更多