所以我有这个字典,我正在转换为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',
}
答案 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')])
foo
在spam
之前,因为原始字典有任意顺序。
答案 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()
。