【问题标题】:Sort Json data in list according to timestamp根据时间戳对列表中的 Json 数据进行排序
【发布时间】:2017-12-06 08:35:07
【问题描述】:

我正在加载数据(20 个元素)到另一个文件加载...这里我想根据我在列表元素中使用的时间戳对这 20 个元素进行排序。

import json
from collections import OrderedDict
import datetime
import os

if os.path.exists("qwerty.json"):
    record = json.load(open("qwerty.json", "r"), object_pairs_hook=OrderedDict)
else:
    record = OrderedDict({})

fo = open("foo.txt", "wb")
abc = list(record.items())[:20] 
print(abc)

command = ""
while command != 'exit':
    command = input('Enter a command(options: create,read,save): ')
    if command == "create":
        name = input('Enter name of the Student:')
        p = input('Student ID: ')
        a = input('Class: ')
        n = input('Marks: ')
        time = datetime.datetime.now().isoformat()

        record[name] = {'Student ID:': p, 'Class:': a, 'Marks': n, 'time': time }

    elif command == 'read':
        z = json.load(open("qwerty.json", "r"), object_pairs_hook=OrderedDict)
        print(z)

    elif command == 'save':
        json.dump(record, open('qwerty.json', "w"))

fo.close()

【问题讨论】:

  • 你的问题是……?

标签: python json file caching lru


【解决方案1】:

琐事:

由于您使用的是 OrderedDict - 您的记录已经按时间戳排序(老实说 - 它们不是,但记录顺序被保留)。

您的代码唯一的意外行为 - 当您“创建”(覆盖)时,存在一名学生排队:

record[name] = {'Student ID:': p, 'Class:': a, 'Marks': n, 'time': time }

而且if name in record: 已经 - 顺序已损坏,因此您关于排序的想法并非毫无意义,但我认为,确定记录顺序比每次都排序记录更好、更合理。

解决方法:

变量名后的方括号表示该对象是可下标的(例如元组、列表、字典、字符串等等)。 Subscriptable 意味着这个对象至少实现了__getitem__() 方法(在你的例子中是__setitem__())。

第一种方法处理大小写,当您尝试从 subscriptable 对象中提取某些内容(通过索引/键/任何内容)时,第二种方法处理大小写 - 当您尝试覆盖某些内容时。 p>

我建议使用自定义类来实现这样的功能:

class OrderedTimeDict(OrderedDict):
    def __setitem__(self, key, value):
        if key in self:
            # if key is already exist - move it to the end
            self.move_to_end(key)
        # standard behaviour
        OrderedDict.__setitem__(self, key, value)

并且在您的代码中只使用这个有序字典而不是基本有序!

结论:

优点:不需要对事物进行排序,因为我们保持所需的顺序。

缺点:如果您已经有“无序”数据 - 您需要对其进行一次排序。

要按时间戳对有序字典进行排序,您可以使用此功能:

def sort_by_timestamp(dict):
    return OrderedDict(sorted(dict.items(), key=lambda get_time_stamp: get_time_stamp[1]['time']))

参考资料:

【讨论】:

    猜你喜欢
    • 2020-04-15
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 2013-06-06
    • 2012-07-15
    相关资源
    最近更新 更多