如何按命名值对 Python 字典进行排序
How do I sort a Python Dictionary by a named value
我有一个字典 'dict' 像这样:
{'Name1' : {'value1' : 3.0, 'value2' : 1.4, 'Index' : 2 },
'Name2' : {'value1' : 5.0, 'value2' : 0.1, 'Index' : 1 },
...
}
如何根据 'Index' 字段将词典分类为新词典?
所以我想结束:
{'Name2' : {'value1' : 5.0, 'value2' : 0.1, 'Index' : 1 },
'Name1' : {'value1' : 3.0, 'value2' : 1.4, 'Index' : 2 },
...
}
我试过了
new_dict = sorted(dict.items(), key=lambda x: x['Index'])
但 Python 反对将 str 作为切片。
除了遍历每个项目并将其附加到新词典的笨拙方法之外,还有什么推荐的方法吗?
Python dict是哈希关联容器,不能排序
Python 3 dict 是 insertion-ordered,因此如果您对原始词典的项目集合的副本进行排序并将其理解回字典,它将按照您需要的顺序排列。
x = {
'Name2': {'value1': 5.0, 'value2': 0.1, 'Index': 1},
'Name1': {'value1': 3.0, 'value2': 1.4, 'Index': 2}
}
y = {k: v for k, v in sorted(x.items(), key=lambda item: item[1]['Index'])}
还有,你看过OrderedDict吗?
我假设你的意思是:
{'Name1' : {'value1': 3.0, 'value2': 1.4, 'Index': 2 },
'Name2' : {'value1': 5.0, 'value2': 0.1, 'Index': 1 },
...
}
dict.items()
迭代 对 键和值,因此在您的 lambda
表达式中, x
不是像 {'value1': ...}
,但是像 ('Name2', {'value1': ...})
.
这样的元组
您可以将 lambda x: x['Index']
更改为 lambda x: x[1]['Index']
(即,首先获取元组的第二项(现在应该是嵌套字典),然后获取 'Index'
中的值那本字典。
接下来,sorted()
会给你一个键值对列表(可能是合适的)。如果你真的想要字典,你可以将 sorted(...)
更改为 dict(sorted(...))
,但有两个注意事项:
- 在旧的 Python 版本中,这将再次失去排序(参见 here)。
- 不要使用
dict
作为变量名,否则你会隐藏 built-in dict
构造函数并且会得到类型错误“对象不可调用”。
我有一个字典 'dict' 像这样:
{'Name1' : {'value1' : 3.0, 'value2' : 1.4, 'Index' : 2 },
'Name2' : {'value1' : 5.0, 'value2' : 0.1, 'Index' : 1 },
...
}
如何根据 'Index' 字段将词典分类为新词典? 所以我想结束:
{'Name2' : {'value1' : 5.0, 'value2' : 0.1, 'Index' : 1 },
'Name1' : {'value1' : 3.0, 'value2' : 1.4, 'Index' : 2 },
...
}
我试过了
new_dict = sorted(dict.items(), key=lambda x: x['Index'])
但 Python 反对将 str 作为切片。
除了遍历每个项目并将其附加到新词典的笨拙方法之外,还有什么推荐的方法吗?
Python dict是哈希关联容器,不能排序
Python 3 dict 是 insertion-ordered,因此如果您对原始词典的项目集合的副本进行排序并将其理解回字典,它将按照您需要的顺序排列。
x = {
'Name2': {'value1': 5.0, 'value2': 0.1, 'Index': 1},
'Name1': {'value1': 3.0, 'value2': 1.4, 'Index': 2}
}
y = {k: v for k, v in sorted(x.items(), key=lambda item: item[1]['Index'])}
还有,你看过OrderedDict吗?
我假设你的意思是:
{'Name1' : {'value1': 3.0, 'value2': 1.4, 'Index': 2 },
'Name2' : {'value1': 5.0, 'value2': 0.1, 'Index': 1 },
...
}
dict.items()
迭代 对 键和值,因此在您的 lambda
表达式中, x
不是像 {'value1': ...}
,但是像 ('Name2', {'value1': ...})
.
您可以将 lambda x: x['Index']
更改为 lambda x: x[1]['Index']
(即,首先获取元组的第二项(现在应该是嵌套字典),然后获取 'Index'
中的值那本字典。
接下来,sorted()
会给你一个键值对列表(可能是合适的)。如果你真的想要字典,你可以将 sorted(...)
更改为 dict(sorted(...))
,但有两个注意事项:
- 在旧的 Python 版本中,这将再次失去排序(参见 here)。
- 不要使用
dict
作为变量名,否则你会隐藏 built-indict
构造函数并且会得到类型错误“对象不可调用”。