我正在加载数据(20个元素)加载到另一个文件...这里我想根据我在list元素中使用的时间戳对这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()
答案 0 :(得分:4)
由于您使用的是OrderedDict
- 您的记录已按时间戳排序(说实话 - 它们不是,但记录订单已保留)。
您的代码唯一出现的意外行为 - 当您“创建”(覆盖)时,现有一名学生排队:
record[name] = {'Student ID:': p, 'Class:': a, 'Marks': n, 'time': time }
并且已经if name in record:
- 订单被破坏了,所以你对排序的想法并不是没有意义的,但我认为,确保记录顺序比每次排序记录更好更合理
变量名后的方括号表示此对象是可订阅(例如,元组,列表,字典,字符串等等)。 Subscriptable 表示此对象至少实现__getitem__()
方法(以及您的__setitem__()
方法)。
第一种方法处理大小写,当你试图从可订阅的对象(通过索引/键/任何东西)和第二种方法 - 当你试图覆盖某些东西时。
我建议用自定义类实现这样的功能:
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']))