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

时间:2018-01-01 15:04:24

标签: python python-3.x dictionary

我正在尝试在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

5 个答案:

答案 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'}]]