如何在字典上强加订单?

时间:2017-12-06 00:10:10

标签: python python-3.x

我编写了一个程序,然后后悔没有在OrderedDict s而不是dict s早期创建某些对象。事实上,为了解决这个问题,将一个字典转换为OrderedDict,但我需要将第二个字典转换为OrderedDict,但其的顺序与第一个相同。

dict经常以欺骗性的方式显示,我几乎犯了一个错误。关于这种明显的排序herehere,有几个问题。无论如何,无论如何有序,它可能在眼睛看,需要记住:

{'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具有共同点的任何键,它们的结尾顺序与

中的键相同

4 个答案:

答案 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)

如果ab始终具有完全相同的键,则可以确保根据排序的键创建两个有序的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的排序不能保证在程序的不同执行中保持一致。