我正在尝试在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
答案 0 :(得分:2)
您获得TypeError
的原因是您正在迭代dictionaries
NotAdmin
中的list
并尝试申请sorted
函数到money
属性。当你试图"排序"这显然会失败。一个float
(?)。
因此,sorted
(或修改sort
到位的iterable
函数)的工作方式是采用iterable
并应用"评估& #34;函数到每个元素,以便对它们进行排序。此函数可以在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'}]}
另外,如果您想要按降序顺序排列元素,那么我们可以查看the documentation,看看我们可以将reverse
标志设置为True
。
这只会将行改为:
...
...
data["NotAdmin"].sort(key = lambda d: d["money"], reverse = True)
...
答案 1 :(得分:2)
您想要做的是:
sbt clean assembly
cp target/scala*/project*.jar server/lib
cd server
mvn clean install
cd ../
cp server/target/server*.jar target
通过执行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
的{{1}}进行排序,这是不可能的,也不是您想要的。
答案 2 :(得分:1)
你可以试试这个:
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'}]}
答案 3 :(得分:0)
您得到的错误是由于其定义
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)
了解详情:How to sort a list of objects based on an attribute of the objects?
答案 4 :(得分:0)
这是一线解决方案,您可以尝试
方法是,首先检查密钥是否为'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'}]]