如何在打印之前对 JSON 浮点数据进行排序



我正在尝试获取 JSON 文件中的数据,但在打印之前,我想对money进行排序。这是我的代码

with open("cash.json", "r", encoding="utf-8") as f:
data = json.load(f)
for c in data['NotAdmin']:
a_new_list = sorted(c["money"])
print(a_new_list)

这是我cash.json文件中的内容

{
"NotAdmin": [
{
"money": 200.0,
"name": "Sam",
"password": "1234"
}, {
"money": 150.0,
"name": "Jasmin",
"password": "1573"
}, {
"money": 100.0,
"name": "Ali",
"password": "1856"
}
],
"admin": [
{
"name": "Adam",
"password": "6767"
}, {
"name": "Eva",
"password": "2222"
}
]
}

我一直收到此错误TypeError: 'float' object is not iterable

您获得TypeError的原因是您正在迭代NotAdminlist中的dictionaries,并尝试将sorted函数应用于money属性。这显然会失败,因为您正在尝试"排序"float(?

因此,sorted(或修改iterablesort函数)的工作方式是采用iterable并对每个元素应用"评估"函数,以便对它们进行排序。此函数可以在key参数下传入,或者如果未传入,Python 将自动决定如何对元素进行排序。

为了将其应用于我们的代码,我们希望获取data["NotAdmin"]列表并将.sort方法与key一起应用,以选择每个字典的money属性。我们可以使用(匿名)lambda函数来做到这一点。

所以,这是完整的代码:

with open("cash.json", "r", encoding="utf-8") as f:
data = json.load(f)
data["NotAdmin"].sort(key = lambda d: d["money"])
print(data)

输出:

{'admin': [{'password': '6767', 'name': 'Adam'}, {'password': '2222', 'name': 'Eva'}], 'NotAdmin': [{'password': '1856', 'money': 100.0, 'name': 'Ali'}, {'password': '1573', 'money': 150.0, 'name': 'Jasmin'}, {'password': '1234', 'money': 200.0, 'name': 'Sam'}]}

而且,如果您想按降序排列元素,那么我们可以查看文档,看看我们可以将reverse标志设置为True.

这只会将行更改为:

...
...
data["NotAdmin"].sort(key = lambda d: d["money"], reverse = True)
...

你想做的是:

with open("cash.json", "r", encoding="utf-8") as f:
data = json.load(f)
a_new_list = sorted(data['NotAdmin'], key=lambda k: k['money'])
print(a_new_list)

通过做sorted(c["money"]),你想对一个float进行排序,字典cmoney,这是不可能的,也不是你想要的。

你可以试试这个:

with open("cash.json", "r", encoding="utf-8") as f:
data = json.load(f)
new_data = {a:sorted(b, key=lambda x:x['money']) if all('money' in c for c in b) else b for a, b in data.items()}

输出:

{'NotAdmin': [{'money': 100.0, 'password': '1856', 'name': 'Ali'}, {'money': 150.0, 'password': '1573', 'name': 'Jasmin'}, {'money': 200.0, 'password': '1234', 'name': 'Sam'}], 'admin': [{'password': '6767', 'name': 'Adam'}, {'password': '2222', 'name': 'Eva'}]}

您得到的错误是由于它的定义

sorted??
Docstring: sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
Type:      builtin_function_or_method

为了解决您的问题,您需要使用数组对象的属性对数组对象进行排序,示例

with open("cash.json", "r", encoding="utf-8") as f:
data = json.load(f)
for c in data['NotAdmin']:
a_new_list = sorted(c, key=lambda x: x['money'], reverse=True)
print(a_new_list)

查看更多: 如何根据对象的属性对对象列表进行排序?

这是单行解,可以试试

方法是,首先检查键是否'NotAdmin',然后排序键'money'

import json
print([sorted(value, key=lambda x: x['money']) for key,value in json.loads(open('data.json','r').read()).items() if key=='NotAdmin'])

输出:

[[{'name': 'Ali', 'money': 100.0, 'password': '1856'}, {'name': 'Jasmin', 'money': 150.0, 'password': '1573'}, {'name': 'Sam', 'money': 200.0, 'password': '1234'}]]

最新更新