面临下一个问题:我需要一些关于如何按键和值排序字典的提示,但是值可以是不同的类型,例如:
some_dict = {
'list_from_one_element': ['one'],
'list_from_many_elements': ['one', 'three', 'two'],
'dict_with_dicts':
{
'first': '1',
'third': '3'
'second': '2',
},
}
所以,最后我需要这样的smt:
dict_items([('dict_with_dicts', {'first': '1', 'second': '2', 'third': '3'}), ('list_from_many_elements', ['one', 'two', 'three']), ('list_from_one_element', ['one'])])
我试着这样写for循环:
sorted_dict = dict()
for key in sorted(some_dict):
for value in some_dict.values():
sorted_dict.update({key: sorted(value)})
for key in sorted_dict.get('dict_with_dicts'):
sorted_dict.get('dict_with_dicts').update({key: dict_with_dicts.get(key)})
但是有没有办法让它变得美丽呢?
如果用集合替换列表,它实际上返回true(我纠正了示例中假定的拼写错误,因为字典确实不同):
some_dict_1 = {
'some_list_1': {'one', 'two'},
'some_dict_with_dicts': {
'one': '1',
'two': '2'
}
}
some_dict_2 = {
'some_list_1': {'two', 'one'},
'some_dict_with_dicts': {
'two': '2',
'one': '1'
}
}
print(some_dict_1 == some_dict_2) # -> True
然而,在最近的python版本中,字典是有序的,被复制的项的顺序定义为按插入:https://docs.python.org/3/library/stdtypes.html typesmapping
在3.7版更改:字典顺序保证为插入顺序秩序。此行为是CPython从3.6开始的实现细节。
我曾经遇到过类似的问题,因为我需要平铺一个嵌套的字典并从值中生成一个列表。然后我使用了这样的代码:
def sort_recursive(d):
try:
items = d.items()
except AttributeError:
return d
return {k: sort_recursive(v) for k, v in sorted(items)}
print(sort_recursive(some_dict_1))
但是,就你的目的而言,我认为你不需要它。