我编写了一个程序,然后后悔没有在OrderedDict
s而不是dict
s早期创建某些对象。事实上,为了解决这个问题,将一个字典转换为OrderedDict,但我需要将第二个字典转换为OrderedDict,但其键的顺序与第一个相同。
dict
经常以欺骗性的方式显示,我几乎犯了一个错误。关于这种明显的排序here和here,有几个问题。无论如何,无论如何有序,它可能在眼睛看,需要记住:
{'a':5,'b':7, 'c':3, 'd':9} == {'d':9,'b':7,'a':5, 'c':3}
>> True
所以如果有两个Python词典:
a = {'a':5, 'b':7, 'c':3, 'd':9}
b = {'c':2, 'b':1, 'd':17, 'a':8}
我可以像这样修正a
的顺序:
c = OrderedDict(a)
print (c)
>> OrderedDict([('a', 5), ('b', 7), ('c', 3), ('d', 9)])
如何对字典b
强制执行订单,将其转换为OrderedDict
,其键的顺序与a
相同?
在我的确切用例中,两个词典都有相同的键,但我很想知道你如何能够做到这一点,比如说你的两个词典是:
a = {'a':5, 'b':7, 'c':3, 'd':9}
b = {'f':3, 'c':2, 'd':17, 'a':8, 'e':9, 'b':1}
如何将a和b转换为OrderedDict,但要确保b与a具有共同点的任何键,它们的结尾顺序与
中的键相同答案 0 :(得分:2)
您现有的字典对订购不做任何承诺。让我们先把它作为有序词典:
ordered_a = OrderedDict(a.items())
现在,假设你有另一个字典b
,并且你希望它的键与ordered_a
的顺序相同,如果它们存在,那么:
ordered_b = OrderedDict(
[(k, b[k]) for k in itertools.chain(ordered_a, b.keys() - a.keys())
if k in b])
在这里,我们将b
中的项目添加到ordered_b
中,其顺序与ordered_a
相同,然后将b
的其余项添加到任意位置订购。这将处理以下可能性:
a
包含b
没有的密钥;或b
包含a
没有的密钥。答案 1 :(得分:1)
我假设你想要按排序顺序。试试这个
c = OrderedDict(sorted(a.items()))
答案 2 :(得分:1)
如果a
和b
始终具有完全相同的键,则可以确保根据排序的键创建两个有序的dicts:
oa = OrderedDict(sorted(a.items(), key=lambda t: t[0]))
ob = OrderedDict(sorted(b.items(), key=lambda t: t[0]))
或只是强制b
拥有a
获得的任何订单:
oa = OrderedDict(a)
ob = OrderedDict((k, b[k]) for k in oa)
答案 3 :(得分:1)
如果您希望OrderedDict以b
的顺序添加c
个项目,请迭代c
以产生排序:
d = OrderedDict((k, b[k]) for k in c)
但是,请注意,c
的排序不能保证在程序的不同执行中保持一致。