Python OrderedDict:按元组顺序排序?

时间:2015-05-28 19:34:58

标签: python

所以我有这个字典,我正在转换为OrderedDict。在转换时,我想按照其键出现在单独元组中的顺序对OrderedDict进行排序。我想要附加到OrderedDict末尾的任何其他值。排序元组中不存在的键应该被忽略。

我想我已经掌握了大部分内容,但是我在围绕lambda排序函数缠绕我的大脑时遇到了麻烦。你能帮我解决一下吗?

from collections import OrderedDict

d = {
    'spam': 'tasty',
    'subtitle': 'A Subtitle',
    'title': 'Test Title',
    'foo': 'bar',
}

key_order = ('title', 'subtitle', 'non_in_dictionary')
ordered_dict = OrderedDict(sorted(d.items(), key=lambda ???? ))

应该生成ordered_dict

{
    'title': 'Test Title',
    'subtitle': 'A Subtitle',
    'spam': 'tasty',
    'foo': 'bar',
}

3 个答案:

答案 0 :(得分:4)

另一种比排序更简单的方法是从标题中创建OrderedDict,然后从原始OrderedDict更新dict

from collections import OrderedDict

d = {
    'spam': 'tasty',
    'subtitle': 'A Subtitle',
    'title': 'Test Title',
    'foo': 'bar',
}

key_order = ('title', 'subtitle')
od = OrderedDict((k, d[k]) for k in key_order)
od.update(d)

或者tzaman在评论中建议,因为值将始终在以下更新中设置,您可以使用以下内容构建原始OrderedDict

od = OrderedDict.fromkeys(key_order)
od.update(d)

答案 1 :(得分:0)

ordered_dict = OrderedDict(sorted(dict.items(),
               key=lambda x: key_order.index(x[0])if x[0] in key_order else 10e10 ))

这使用键顺序中给定项目的索引的键。如果找不到,则使用大量数字,将其放在最后。它产生以下OrderedDict

OrderedDict([('title', 'Test Title'), ('subtitle', 'A Subtitle'), ('foo', 'bar'), ('spam', 'tasty')])

foospam之前,因为原始字典有任意顺序。

答案 2 :(得分:-1)

from collections import OrderedDict

d = {
    'spam': 'tasty',
    'subtitle': 'A Subtitle',
    'title': 'Test Title',
    'foo': 'bar',
}

key_order = ('title', 'subtitle')
key_order = OrderedDict((k, i) for i, k in enumerate(key_order))
ordered_dict = OrderedDict(sorted(d.iteritems(), key=lambda k: key_order.get(k[0], float("inf"))))

在python 3中使用items()代替iteritems()