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

Big*_*gen 3 python dictionary python-3.x 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"))
Run Code Online (Sandbox Code Playgroud)

我一直在学习和使用Python 3.6,而且我不知道,3.6中的dicts现在已经订购了,所以这实际上按照我的意图打印出来.这只是愚蠢的运气我想Python 3.6给了我我所需要的!

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

Blc*_*ght 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),
                        ])
Run Code Online (Sandbox Code Playgroud)

OrderedDict作品就像一个正常的dict在大多数方面,除了具有其它不同repr和一些额外的方法.您可以在文档中阅读更多相关信息.

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

但是可能值得考虑的是,如果您需要一个非常具体的数据订单,字典可能不是用于存储它的最佳类型.我看到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"))
Run Code Online (Sandbox Code Playgroud)

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