python 3.6 与旧版本中的字典顺序

Dict order in python 3.6 vs older

当我 运行 通过 tabulate.

final_dict = {'Visitor Team': visitor_team, 'Visitor Rating': visitor_rating, 'Home Team': home_team,
              'Home Rating': home_rating, 'Expected Winner': expected_winner, 'Margin': expected_winner_diff}

print(tabulate(final_dict, headers="keys", floatfmt=".2f", tablefmt="fancy_grid"))

我一直在学习和使用 Python 3.6,而且我不知道的是,现在已经订购了 3.6 中的命令,所以这实际上按照我的预期打印出来。我猜 Python 3.6 正好满足了我的需要!

但是我在另一台计算机上安装了 Python 3.5,但打印出来的结果并不如我所愿。我一直在阅读有关 ordereddicts 的内容,但不确定如何使用它。我是否需要先将 final_dict 声明为空,然后按我需要的键顺序迭代它?

Python 3.6 中的字典是有序的,但该功能被认为是您不应依赖的实现细节(除了少数特定情况,如 **kwargs)。如果您确实需要特定顺序,则应改用 collections.OrderedDict。您可以使用按所需顺序排列的 key, value 元组列表构造一个:

from collections import OrderedDict

finaldict = OrderedDict([('Visitor Team', visitor_team),
                         ('Visitor Rating', visitor_rating),
                         ('Home Team', home_team),
                         ('Home Rating', home_rating),
                         ('Expected Winner', expected_winner),
                         ('Margin', expected_winner_diff),
                        ])

除了具有不同的 repr 和一些额外的方法外,OrderedDict 在大多数方面都像普通的 dict 一样工作。您可以在 the docs.

中阅读更多相关信息

在 Python 3.6+ 中,如果您的键字符串是有效标识符(例如 OrderedDict(Margin=expected_winner_diff)),您还可以对构造函数使用关键字参数。与正常 dict 的排序不同,关键字的顺序保证被保留(不是实现细节)。虽然这不是向后兼容的(并且无论如何都不能用于您的 non-identifier 键)。

但可能值得考虑的是,如果您需要非常具体的数据顺序,字典可能不是用于存储它的最佳类型。我看到您正在使用的 tabulate 函数来自图书馆,根据文档,它接受许多不同格式的数据。我可能只是将列数据列表传递给它,并分别给它 headers:

data = [visitor_team, visitor_rating, home_team,
        home_rating, expected_winner, expected_winner_diff]

headers = ["Visitor Team", "Visitor Rating", "Home Team",
           "Home Rating", "Expected Winner", "Margin"]

print(tabulate(data, headers=headers, floatfmt=".2f", tablefmt="fancy_grid"))

(请注意,我还没有实际测试过该代码,因为我的系统上没有 tabulate 库。但它至少应该接近工作。)