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

时间:2017-06-03 00:35:20

标签: python python-3.x dictionary python-3.5 python-3.6

当我通过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中的dicts现在已经订购了,所以这实际上按照我的意图打印出来。这只是运气不好我猜Python 3.6给了我正确的东西!

但是我在另一台计算机上安装了Python 3.5,这并没有像我想的那样打印出来。我一直在阅读有关订单,但我不确定如何使用它。我是否需要首先将final_dict声明为空,然后迭代到我需要的关键顺序?

1 个答案:

答案 0 :(得分:6)

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),
                        ])

OrderedDict在大多数方面与普通dict一样,除了使用不同的repr和一些其他方法。您可以在the docs中了解有关它的更多信息。

在Python 3.6+中,如果您的密钥字符串是有效的标识符(例如OrderedDict(Margin=expected_winner_diff)),您还可以使用构造函数的关键字参数。与普通dict的排序不同,保证关键字的顺序(不是实现细节)。但这并不是向后兼容的(无论如何都不能用于你的非标识符键)。

但值得考虑的是,如果您需要一个非常具体的数据订单,字典可能不是用于存储它的最佳类型。我看到您使用的tabulate函数来自一个库,根据文档,它接受许多不同格式的数据。我可能只是传递一个列数据列表,并分别给它标题:

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库。但它应该至少接近工作。)