python 3.6与更早版本中的Dict顺序

python 3.6与更早版本中的Dict顺序,python,python-3.x,dictionary,python-3.5,python-3.6,Python,Python 3.x,Dictionary,Python 3.5,Python 3.6,当我运行制表时,我需要按照这个确切的顺序(访客团队、访客评级、主队、主队评级、预期赢家、保证金)打印出这段代码 final_dict = {'Visitor Team': visitor_team, 'Visitor Rating': visitor_rating, 'Home Team': home_team, 'Home Rating': home_rating, 'Expected Winner': expected_winner, 'Margin': expe

当我运行
制表时,我需要按照这个确切的顺序(访客团队、访客评级、主队、主队评级、预期赢家、保证金)打印出这段代码

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"))
我一直在学习和使用Python3.6,我不知道,3.6中的dicts现在已经被订购了,所以这实际上是按照我的预期打印出来的。这只是愚蠢的运气,我想Python3.6给了我我所需要的


但是我在另一台计算机上安装了Python3.5,但它并没有像我想要的那样打印出来。我一直在读关于ordereddicts的文章,但我不知道如何确切地使用它。我是否需要先将final_dict声明为空,然后按我需要的键顺序迭代它

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

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
一样工作。您可以在中阅读更多关于它的信息

在Python3.6+中,如果键字符串是有效的标识符(例如,
OrderedDict(Margin=expected\u winner\u diff)
),则还可以使用关键字参数来构造函数。与普通
dict
s的顺序不同,关键字的顺序保证被保留(而不是实现细节)。但这并不向后兼容(而且无论如何也不能用于非标识符密钥)

但是,如果您需要对数据进行非常特定的排序,那么字典可能不是存储数据的最佳类型,这可能值得考虑。我看到您使用的
制表
功能来自一个库,根据文档,它接受许多不同格式的数据。我可能只会给它传递一个列数据列表,并分别给它标题:

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"))

(注意,我没有实际测试该代码,因为我的系统上没有
制表
库。但它至少应该可以正常工作。)

字典没有按顺序存储键。如果您想维护订单,应该使用列表。您没有提供函数
制表
,但这就是完成打印的地方。这里的重要问题是,
如何通过
最终目录
的元素将增量列成表格?它如何使用
标题的值来控制打印顺序?它如何知道字典中的哪个元素与哪个头匹配?我认为您应该查看
表格
,了解它是如何工作的。否则,无法保证更改为订购的ICT将解决您的问题。@PaulCornelius这些都是优点<代码>制表
是一个用于打印制表输出的软件包:我没有编写它,所以我不确定它的“内部”工作原理。文档说制表的第一个参数可以是列表列表。这似乎是控制列顺序的唯一可靠方法。由于这对您很重要,我会先将您的数据转换为列表,然后再将其转换为表格。相关文档说,
数据
必须是二维数据类型,如列表列表或列表目录。简单的列表是行不通的。我猜OP的原始代码是有效的,因为他所有的字典值实际上都是列表。@PaulCornelius是的,这是正确的。所有这些都存储为列表。我会好好玩玩我所拥有的,看看我能想出什么。我最终只是把我的最终结果变成了一份清单。我想,处理清单,而不是在订购信息技术时乱来要容易得多。谢谢你们的帮助,伙计们!