【问题标题】:Python 3.5: Sort dictionary by key (dates)Python 3.5:按键排序字典(日期)
【发布时间】:2016-07-24 14:25:05
【问题描述】:

我是 Python 新手,我正在尝试按键对字典进行排序。键是日期时间对象。它适用于 4 月 1 日、4 月 2 日、4 月 3 日,但它会将 4 月 4 日置于 1 日至 2 日之间。我已经尝试过 Ordereddict,如 here. 所述。

我只是不明白。任何帮助表示赞赏...

我的代码:

for part in msg.walk():
        if partNum == 0:
            rawDate = part['Date']
            date = parse_date(rawDate)

        if part.get_content_type() == 'text/plain':
            content = part.get_payload()
            splitted_content = content.split('\r\n')
            pending_tb = str(splitted_content[8])[70:].strip()

        if partNum == 2:
            values[date] = pending_tb
            #TODO sort by date


        partNum += 1


write_file(OrderedDict(sorted(values.items(), key=lambda t: t[0])))

parse_date 函数:

def parse_date(rawdate):
    date_tuple = email.utils.parsedate_tz(rawdate)
    if date_tuple:
        date =  datetime.datetime.fromtimestamp(email.utils.mktime_tz(date_tuple))
        formatted_date = date.strftime("%a, %d %b %Y %H:%M:%S")
        return formatted_date
else:
    print("ERROR: kon datum niet parsen.")
    exit(-1)

还有write_file函数:

def write_file(values):
    filepath = "temp.csv"
    file = open(filepath, "a+")

    for k,v in sorted(values.items()):
        if len(k) > 0:
            file.write(k + "\t\t" + v + "\n")

输出的打印屏幕:http://prntscr.com/ao6qst

提前致谢。

【问题讨论】:

  • 从您的输出中,在我看来,输出不是按日期排序(如数字),而是按字典顺序排序。即,F 出现在 M 之前,S 之前出现
  • 非常简单,将datetime 对象保留为键而不是格式化它们。所以注释掉formatted_date = date.strftime("%a, %d %b %Y %H:%M:%S")return date
  • 有道理...直到现在我才注意到...非常感谢!
  • 您应该接受您的回答,这样该问题就不会留在未回答列表中。为此,请单击您的答案投票数下方的灰色复选标记。
  • 保持日期为 datetimesorted(dict) 按键排序。

标签: python sorting python-3.x dictionary


【解决方案1】:

就像在 cmets 中所说的那样,字典对字符串而不是 datetime 对象进行排序。所以解决方法是返回日期,并在写入文件函数中格式化日期。

感谢您的快速解答!

【讨论】:

    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多