gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:09:46 25 4
gpt4 key购买 nike

我正在尝试收集某个游戏中所有数字 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com