如何解压字典以使其通过?
How to unpack dictionary in order that it was passed?
这是以下问题:
main_module.py
from collections import OrderedDict
from my_other_module import foo
a = OrderedDict([
('a', 1),
('b', 2),
('c', 3),
('d', 4),
])
foo(**a)
my_other_module.py
def foo(**kwargs):
for k, v in kwargs.items():
print k, v
当我 运行 main_module.py
我希望按照我指定的顺序打印输出:
a 1
b 2
c 3
d 4
但我得到的是:
a 1
c 3
b 2
d 4
我确实知道这与 **
运算符的实现方式有关,并且它以某种方式松散了字典对的传递方式。我也知道 python 中的字典是不像列表那样有序,因为它们是作为哈希表实现的。是否有任何类型的 'hack' 我可以应用以便获得在此上下文中所需的行为?
P.S。 - 在我的情况下,我无法对 foo 函数中的字典进行排序,因为除了传入值的严格顺序外,没有可以遵循的规则。
通过使用 **a
,您将有序字典解包为参数字典。
所以当你输入 foo
时,kwargs
只是一个普通的字典,不保证顺序(除非你使用 Python 3.6+,但这仍然是一个实现3.6 中有详细说明,但顺序在 3.7 中正式生效:)
在这种情况下,您可能会丢失 packing/unpacking,因此它对于旧版本的 python 是可移植的。
from collections import OrderedDict
def foo(kwargs):
for k, v in kwargs.items():
print(k, v)
a = OrderedDict([
('a', 1),
('b', 2),
('c', 3),
('d', 4),
])
foo(a)
这是以下问题:
main_module.py
from collections import OrderedDict
from my_other_module import foo
a = OrderedDict([
('a', 1),
('b', 2),
('c', 3),
('d', 4),
])
foo(**a)
my_other_module.py
def foo(**kwargs):
for k, v in kwargs.items():
print k, v
当我 运行 main_module.py
我希望按照我指定的顺序打印输出:
a 1
b 2
c 3
d 4
但我得到的是:
a 1
c 3
b 2
d 4
我确实知道这与 **
运算符的实现方式有关,并且它以某种方式松散了字典对的传递方式。我也知道 python 中的字典是不像列表那样有序,因为它们是作为哈希表实现的。是否有任何类型的 'hack' 我可以应用以便获得在此上下文中所需的行为?
P.S。 - 在我的情况下,我无法对 foo 函数中的字典进行排序,因为除了传入值的严格顺序外,没有可以遵循的规则。
通过使用 **a
,您将有序字典解包为参数字典。
所以当你输入 foo
时,kwargs
只是一个普通的字典,不保证顺序(除非你使用 Python 3.6+,但这仍然是一个实现3.6 中有详细说明,但顺序在 3.7 中正式生效:
在这种情况下,您可能会丢失 packing/unpacking,因此它对于旧版本的 python 是可移植的。
from collections import OrderedDict
def foo(kwargs):
for k, v in kwargs.items():
print(k, v)
a = OrderedDict([
('a', 1),
('b', 2),
('c', 3),
('d', 4),
])
foo(a)