【问题标题】:Python read line from file and sort int descendingPython从文件中读取行并对int进行降序排序
【发布时间】:2017-01-14 18:32:25
【问题描述】:

所以我得到了这个文本文件,如下所示:

 PID     TTY              TIME          CMD
1000    pts/2           00:00:00        aash
9000    pts/2           00:00:00        bash
3000    pts/2           00:00:00        cash

我最终想要的是某种字典,我可以在其中保存 |(PID,CMD)|按 PID 降序排列。

所以它看起来像这样:

[(9000,bash),(3000,cash),(1000,aash)]

有什么想法吗? 这就是我读取文件并保存在字典中的方式。

dict = {}

with open('newfile.txt') as f:
     next(f)   #skipping first line
     for line in f:
        result[line.split()[3]] = int(line.split()[0])

感谢任何形式的帮助!提前致谢!

【问题讨论】:

  • 如果你需要排序的东西,你可能不想使用dict。为什么需要排序?之后你对排序后的数据做了什么?
  • 对不起,我忘了说:我下周就要期末考试了,这只是我教授给我们的一些练习。
  • 好吧,你不能对字典进行排序,所以我认为你需要改变你的问题或添加一些细节,然后才能真正给你建议。也许为数据制定自己的目标,例如打印出排序列表。
  • 这并不重要。最后,我只需要按排序顺序打印出来。这只是我能想到的将键与值一起保存的唯一数据结构。对不起,我在 python 方面不是很有经验!

标签: python sorting dictionary


【解决方案1】:

所以这是解决方案:

import collections

result = {}

with open('newfile.txt') as f:
    next(f)
    for line in f:
        result[line.split()[3]] = int(line.split()[0])

print(collections.OrderedDict(sorted(result.items(), key=lambda t: t[1])))

这是打印出来的:

OrderedDict([('aash', 1000), ('cash', 3000), ('bash', 9000)])])

【讨论】:

  • 您在同一行调用 split 两次。这可能是现实应用中的严重性能问题
【解决方案2】:

如果您需要以列表结尾,那么最好将数据读入列表然后对其进行排序,方法如下:

lst = []
with open('newfile.txt') as f:
    next(f)
    for line in f:
        if line.split() != '':  # watch out for empty lines
            a, b, c, d = line.split()
            lst.append((int(a), d))

lst = sorted(lst)
print(lst)

====
[(1000, 'aash'), (3000, 'cash'), (9000, 'bash')]

sorted() 按元组中的第一项排序,因此您可以按其基本形式使用它。

如果你需要的是一个对键进行排序的字典,那么你可以使用OrderedDict,只需将其导入并在代码中添加另一行:

from collections import OrderedDict

然后

d = OrderedDict(lst)
print(d)

结果如下:

OrderedDict([(1000, 'aash'), (3000, 'cash'), (9000, 'bash')])

【讨论】:

    猜你喜欢
    • 2020-10-15
    • 2015-12-27
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多