python - 当字典的长度/顺序发生变化时,如何从字典列表中提取特定值

标签 python json api

我正在尝试收集某个游戏中所有数字 Assets 的数据。我正在从这个 API 中提取我的数据。 URL 末尾的 1 表示 token_id = 1。我的代码将从 1 循环到大约 1。 51,400 并收集我需要的数据。

我正在查看的三个变量是“catch_number”、“class_name”和“level”。这些都出现在自己的字典中的“traits”下,但根据 token_id,它们以不同的顺序出现。

参见example其中 token_id 的 1,7 和 9 的顺序和长度不同。

无论字典列表的顺序长度如何,如何提取“trait_type”:“class_name”的值(例如)?

由于它们出现的顺序不同,我们不能使用 [0] - [4] 来引用特定的词典。

而且由于字典列表的长度发生了变化,所以我们不能使用 itemgetter 来排序,这是我最近尝试的。

import json
import requests
import csv
from operator import itemgetter

result = {}
max_id_to_get = 25

for token_id in range(1,max_id_to_get):
    r = requests.get('https://api.opensea.io/asset/0x5d00d312e171be5342067c09bae883f9bcb2003b/{}'.format(token_id))
    EMONA_json = r.json()
    EMONA_str = json.dumps(EMONA_json, indent=2)

    traits = EMONA_json['traits']
    traits.sort(key=itemgetter('trait_type'))

    token_id = EMONA_json['token_id']
    name = (traits[2]['value'])
    level = (traits[3]['value'])
    catch_number = (traits[1]['value'])
    owner_address = EMONA_json['owner']['address']
    result[token_id] = {"name":name, "level":level, "catch_number":catch_number, "owner_address":owner_address}

with open('output.csv', 'w') as csvFile:
    writer = csv.writer(csvFile)
    writer.writerow(["token_id", "name", "level", "catch_number", "owner_address"])
    for id in result:
        writer.writerow([id, result[id]['name'], result[id]['level'], result[id]['catch_number'], result[id]['owner_address']])
csvFile.close()

最佳答案

这些特征以 json 对象列表的形式给出,没有确定的顺序。对您来说,最简单的解决方案是迭代每个标记的特征列表,并检查 trait_type 是否在您感兴趣的类型集中。

排序不是一个好的解决方案,因为如果添加新的 Trait_type,顺序可能会改变,索引 1,2,3 可能不再引用您感兴趣的特征。此外,排序比简单排序慢迭代列表。

而是在特征字典中维护一个trait_type的字典,这样你就可以轻松访问它。

for token_id in range(1,max_id_to_get):
    r = requests.get('https://api.opensea.io/asset/0x5d00d312e171be5342067c09bae883f9bcb2003b/{}'.format(token_id))
    EMONA_json = r.json()
    EMONA_str = json.dumps(EMONA_json, indent=2)

    interested_traits = ['catch_number', 'class_name', 'level']
    trait_dict = {}
    traits = EMONA_json['traits']
    for trait in traits:
        if trait['trait_type'] in interested_traits:
            trait_dict[trait['trait_type']] = trait

    token_id = EMONA_json['token_id']
    name = trait_dict['class_name']['value']
    level = trait_dict['level']['value']
    catch_number = trait_dict['catch_number']['value']
    owner_address = EMONA_json['owner']['address']
    result[token_id] = {"name":name, "level":level, "catch_number":catch_number, "owner_address":owner_address}

关于python - 当字典的长度/顺序发生变化时,如何从字典列表中提取特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58280358/

相关文章:

javascript - 如何获取对象长度

javascript - 如何在Javascript中将多个json数组合并为一个数组swift子数组?

android - REST api项目的用户认证方法

Python 正则表达式,如何从字符串中删除所有匹配项

python - 为什么我的 Vimspector 调试 session 没有初始化?

json - 有人可以告诉我我的package.json文件出了什么问题吗?

ios - 如何使用 AFImageRequestOperation 从 Web 服务器 API 检索图像?

xml - Magento REST API 故障 : invalid xml

python - __init__() 中的类型错误,意外的参数 python

python - 使用python正则表达式查找重复表达式