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
库。但它至少应该接近工作。)
当我 运行 通过 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
库。但它至少应该接近工作。)