从重复项JSON获取不同的值

2024-05-23 22:32:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个json派生的dict:

{
    "stats": [
        {
            "name": "Jengas",
            "time": 166,
            "uid": "177098244407558145",
            "id": 1
        },
        {
            "name": "- k",
            "time": 20,
            "uid": "199295228664872961",
            "id": 2
        },
        {
            "name": "MAD MARX",
            "time": "0",
            "uid": "336539711785009153",
            "id": 3
        },
        {
            "name": "loli",
            "time": 20,
            "uid": "366299640976375818",
            "id": 4
        },
        {
            "name": "Woona",
            "time": 20,
            "uid": "246996981178695686",
            "id": 5
        }
    ]
}

我想从列表中的每个人那里得到“时间”,并用它来排序。你知道吗

所以我得到的结果是:

TOP 10:
Jengas: 166
Loli: 20

我的第一个尝试是列出重复项的不同值。你知道吗

现在的代码是:

with open('db.json') as json_data:
    topvjson = json.load(json_data)
    print(topvjson)
    d = topvjson['stats'][0]['time']
    print(d)

Tags: nameidjsonuiddatatimestatsdict
3条回答

提取stats列表,使用适当的键对其应用sort

from json import loads

data = loads("""{
  "stats": [{
    "name": "Jengas",
    "time": 166,
    "uid": "177098244407558145",
    "id": 1
  }, {
    "name": "- k",
    "time": 20,
    "uid": "199295228664872961",
    "id": 2
  }, {
    "name": "MAD MARX",
    "time": "0",
    "uid": "336539711785009153",
    "id": 3
  }, {
    "name": "loli",
    "time": 20,
    "uid": "366299640976375818",
    "id": 4
  }, {
    "name": "Woona",
    "time": 20,
    "uid": "246996981178695686",
    "id": 5
  }]
}""")

stats = data['stats']
stats.sort(key = lambda entry: int(entry['time']), reverse=True)

print("TOP 10:")
for entry in stats[:10]:
  print("%s: %d" % (entry['name'], int(entry['time'])))     

这张照片:

TOP 10:
Jengas: 166
- k: 20
loli: 20
Woona: 20
MAD MARX: 0

请注意,time既不是整数也不是字符串:数据集中既有0也有"0"。这就是为什么需要转换int(...)。你知道吗

下面是一种使用内置^{}函数的方法:

data = {
    "stats": [
        {
            "name": "Jengas",
            "time": 166,
            "uid": "177098244407558145",
            "id": 1
        },
        {   
           etc ...
        }
    ]
}

print('TOP 3')
sorted_by_time = sorted(data['stats'], key=lambda d: int(d['time']), reverse=True)

for i, d in enumerate(sorted_by_time, 1):
    if i > 3: break
    print('{name}: {time}'.format(**d))

输出:

TOP 3
Jengas: 166
- k: 20
loli: 20

您可以对dict值列表进行排序,如下所示:

代码:

top_three = [(x[1], -x[0]) for x in sorted(
    (-int(user['time']), user['name']) for user in stats['stats'])][:3]

这是通过计算时间和名称并构建一个元组来实现的。元组可以排序,然后在排序之后提取名称(通过:x[1])。你知道吗

测试代码:

stats = {
    "stats": [{
        "name": "Jengas",
        "time": 166,
        "uid": "177098244407558145",
        "id": 1
    }, {
        "name": "- k",
        "time": 20,
        "uid": "199295228664872961",
        "id": 2
    }, {
        "name": "MAD MARX",
        "time": "0",
        "uid": "336539711785009153",
        "id": 3
    }, {
        "name": "loli",
        "time": 20,
        "uid": "366299640976375818",
        "id": 4
    }, {
        "name": "Woona",
        "time": 20,
        "uid": "246996981178695686",
        "id": 5
    }]
}

top_three = [x[1] for x in sorted(
    (-int(user['time']), user['name']) for user in stats['stats'])][:3]

print(top_three)

结果:

[('Jengas', 166), ('- k', 20), ('Woona', 20)]

相关问题 更多 >