我正在尝试获取 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
的原因是您正在迭代NotAdmin
list
中的dictionaries
,并尝试将sorted
函数应用于money
属性。这显然会失败,因为您正在尝试"排序"float
(?
因此,sorted
(或修改iterable
的sort
函数)的工作方式是采用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
进行排序,字典c
的money
,这是不可能的,也不是你想要的。
你可以试试这个:
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'}]]