我嘗試了不同的 for 回圈嘗試遍歷這個 JSON,但我不知道該怎么做。我有一個數字串列,想將其與“資料”的每個物件(例如,Aatrox、Ahri、Akali 等)下的“鍵”值進行比較,如果數字匹配,則將“名稱”值存盤在另一個清單。
示例:listOfNumbers = [266, 166, 123, 283]
266 和 166 將分別匹配 Aatrox 和 Akshan 物件中的“鍵”,因此我想提取該名稱并將其存盤在串列中。
我知道這個 JSON 主要是通過鍵值訪問而不是被索引,所以我不確定我將如何遍歷 for 回圈中的所有“資料”物件。
JSON即時參考:
{
"type": "champion",
"format": "standAloneComplex",
"version": "12.2.1",
"data": {
"Aatrox": {
"version": "12.2.1",
"id": "Aatrox",
"key": "266",
"name": "Aatrox",
"title": "the Darkin Blade",
"blurb": "Once honored defenders of Shurima against the Void, Aatrox and his brethren would eventually become an even greater threat to Runeterra, and were defeated only by cunning mortal sorcery. But after centuries of imprisonment, Aatrox was the first to find...",
"info": {
"attack": 8,
"defense": 4,
"magic": 3,
"difficulty": 4
},
"image": {
"full": "Aatrox.png",
"sprite": "champion0.png",
"group": "champion",
"x": 0,
"y": 0,
"w": 48,
"h": 48
},
"tags": [
"Fighter",
"Tank"
],
"partype": "Blood Well",
"stats": {
"hp": 580,
"hpperlevel": 90,
"mp": 0,
"mpperlevel": 0,
"movespeed": 345,
"armor": 38,
"armorperlevel": 3.25,
"spellblock": 32,
"spellblockperlevel": 1.25,
"attackrange": 175,
"hpregen": 3,
"hpregenperlevel": 1,
"mpregen": 0,
"mpregenperlevel": 0,
"crit": 0,
"critperlevel": 0,
"attackdamage": 60,
"attackdamageperlevel": 5,
"attackspeedperlevel": 2.5,
"attackspeed": 0.651
}
},
"Ahri": {
"version": "12.2.1",
"id": "Ahri",
"key": "103",
"name": "Ahri",
"title": "the Nine-Tailed Fox",
"blurb": "Innately connected to the latent power of Runeterra, Ahri is a vastaya who can reshape magic into orbs of raw energy. She revels in toying with her prey by manipulating their emotions before devouring their life essence. Despite her predatory nature...",
"info": {
"attack": 3,
"defense": 4,
"magic": 8,
"difficulty": 5
},
"image": {
"full": "Ahri.png",
"sprite": "champion0.png",
"group": "champion",
"x": 48,
"y": 0,
"w": 48,
"h": 48
},
"tags": [
"Mage",
"Assassin"
],
"partype": "Mana",
"stats": {
"hp": 526,
"hpperlevel": 92,
"mp": 418,
"mpperlevel": 25,
"movespeed": 330,
"armor": 21,
"armorperlevel": 3.5,
"spellblock": 30,
"spellblockperlevel": 0.5,
"attackrange": 550,
"hpregen": 5.5,
"hpregenperlevel": 0.6,
"mpregen": 8,
"mpregenperlevel": 0.8,
"crit": 0,
"critperlevel": 0,
"attackdamage": 53,
"attackdamageperlevel": 3,
"attackspeedperlevel": 2,
"attackspeed": 0.668
}
},
"Akali": {
"version": "12.2.1",
"id": "Akali",
"key": "84",
"name": "Akali",
"title": "the Rogue Assassin",
"blurb": "Abandoning the Kinkou Order and her title of the Fist of Shadow, Akali now strikes alone, ready to be the deadly weapon her people need. Though she holds onto all she learned from her master Shen, she has pledged to defend Ionia from its enemies, one...",
"info": {
"attack": 5,
"defense": 3,
"magic": 8,
"difficulty": 7
},
"image": {
"full": "Akali.png",
"sprite": "champion0.png",
"group": "champion",
"x": 96,
"y": 0,
"w": 48,
"h": 48
},
"tags": [
"Assassin"
],
"partype": "Energy",
"stats": {
"hp": 500,
"hpperlevel": 105,
"mp": 200,
"mpperlevel": 0,
"movespeed": 345,
"armor": 23,
"armorperlevel": 3.5,
"spellblock": 37,
"spellblockperlevel": 1.25,
"attackrange": 125,
"hpregen": 9,
"hpregenperlevel": 0.9,
"mpregen": 50,
"mpregenperlevel": 0,
"crit": 0,
"critperlevel": 0,
"attackdamage": 62,
"attackdamageperlevel": 3.3,
"attackspeedperlevel": 3.2,
"attackspeed": 0.625
}
},
"Akshan": {
"version": "12.2.1",
"id": "Akshan",
"key": "166",
"name": "Akshan",
"title": "the Rogue Sentinel",
"blurb": "Raising an eyebrow in the face of danger, Akshan fights evil with dashing charisma, righteous vengeance, and a conspicuous lack of shirts. He is highly skilled in the art of stealth combat, able to evade the eyes of his enemies and reappear when they...",
"info": {
"attack": 0,
"defense": 0,
"magic": 0,
"difficulty": 0
},
"image": {
"full": "Akshan.png",
"sprite": "champion0.png",
"group": "champion",
"x": 144,
"y": 0,
"w": 48,
"h": 48
},
"tags": [
"Marksman",
"Assassin"
],
"partype": "Mana",
"stats": {
"hp": 560,
"hpperlevel": 90,
"mp": 350,
"mpperlevel": 40,
"movespeed": 330,
"armor": 26,
"armorperlevel": 3,
"spellblock": 30,
"spellblockperlevel": 0.5,
"attackrange": 500,
"hpregen": 3.75,
"hpregenperlevel": 0.65,
"mpregen": 8.175,
"mpregenperlevel": 0.7,
"crit": 0,
"critperlevel": 0,
"attackdamage": 52,
"attackdamageperlevel": 3.5,
"attackspeedperlevel": 4,
"attackspeed": 0.638
}
}
}
}
uj5u.com熱心網友回復:
您只需遍歷字典的值,檢查“鍵”項的值是否在您的串列中,如果是這樣,將“名稱”項的值附加到您的輸出串列中。
讓jsonObj成為您的問題中提出的 JSON 物件。那么這段代碼應該可以作業:
listOfNumbers = [266, 166, 123, 283]
names = []
for value in jsonObj['data'].values():
if value['key'] in listOfNumbers:
names.append(value['name'])
Python 中的 JSON 物件只是字典。因此,您最好熟悉 Python 的dict.
uj5u.com熱心網友回復:
假設您完整的 json 在 all_data 中,您將獲得與鍵 'data' 對應的值作為 all_data ['data']。這又是一個字典,您可以使用回傳鍵值對的項對其進行迭代。
names = [value['name'] for name, value in all_data['data'].items() if value['key'] in listOfNumbers]
uj5u.com熱心網友回復:
首先轉換成字典,將鍵映射到名稱,然后在其中進行搜索。
代碼注釋中的進一步解釋:
import json
keys = [266, 166, 123, 283]
# First, we need to parse the JSON string into a Python dictionary
# Skip this if you already have a dictionary.
data = json.loads(raw_json)
# Then map keys to names
key_to_id = {int(obj["key"]): obj["id"] for obj in data["data"].values()}
# Lastly, extract the names we want
ids = [key_to_id[key] for key in keys]
uj5u.com熱心網友回復:
另一種方法是將您dict轉換json為pandas資料框并對其進行過濾。這是一個可以展平任何嵌套的函式json:
from flatten_json import flatten
import pandas as pd
def flatten_nested_json_df(df):
df = df.reset_index()
s = (df.applymap(type) == list).all()
list_columns = s[s].index.tolist()
s = (df.applymap(type) == dict).all()
dict_columns = s[s].index.tolist()
while len(list_columns) > 0 or len(dict_columns) > 0:
new_columns = []
for col in dict_columns:
horiz_exploded = pd.json_normalize(df[col]).add_prefix(f'{col}.')
horiz_exploded.index = df.index
df = pd.concat([df, horiz_exploded], axis=1).drop(columns=[col])
new_columns.extend(horiz_exploded.columns) # inplace
for col in list_columns:
#print(f"exploding: {col}")
df = df.drop(columns=[col]).join(df[col].explode().to_frame())
new_columns.append(col)
s = (df[new_columns].applymap(type) == list).all()
list_columns = s[s].index.tolist()
s = (df[new_columns].applymap(type) == dict).all()
dict_columns = s[s].index.tolist()
return df
有了這個,您可以執行以下操作:
json = json.dumps(data)
df = pd.json_normalize(data)
flatten_nested_json_df(df)
它回傳一個資料框:
index type format version data.Aatrox.version \
0 0 champion standAloneComplex 12.2.1 12.2.1
0 0 champion standAloneComplex 12.2.1 12.2.1
0 0 champion standAloneComplex 12.2.1 12.2.1
0 0 champion standAloneComplex 12.2.1 12.2.1
0 0 champion standAloneComplex 12.2.1 12.2.1
.. ... ... ... ... ...
0 0 champion standAloneComplex 12.2.1 12.2.1
0 0 champion standAloneComplex 12.2.1 12.2.1
0 0 champion standAloneComplex 12.2.1 12.2.1
0 0 champion standAloneComplex 12.2.1 12.2.1
0 0 champion standAloneComplex 12.2.1 12.2.1
data.Aatrox.id data.Aatrox.key data.Aatrox.name data.Aatrox.title \
0 Aatrox 266 Aatrox the Darkin Blade
0 Aatrox 266 Aatrox the Darkin Blade
0 Aatrox 266 Aatrox the Darkin Blade
0 Aatrox 266 Aatrox the Darkin Blade
0 Aatrox 266 Aatrox the Darkin Blade
.. ... ... ... ...
0 Aatrox 266 Aatrox the Darkin Blade
0 Aatrox 266 Aatrox the Darkin Blade
0 Aatrox 266 Aatrox the Darkin Blade
0 Aatrox 266 Aatrox the Darkin Blade
0 Aatrox 266 Aatrox the Darkin Blade
data.Aatrox.blurb ... \
0 Once honored defenders of Shurima against the ... ...
0 Once honored defenders of Shurima against the ... ...
0 Once honored defenders of Shurima against the ... ...
0 Once honored defenders of Shurima against the ... ...
0 Once honored defenders of Shurima against the ... ...
.. ... ...
0 Once honored defenders of Shurima against the ... ...
0 Once honored defenders of Shurima against the ... ...
0 Once honored defenders of Shurima against the ... ...
0 Once honored defenders of Shurima against the ... ...
0 Once honored defenders of Shurima against the ... ...
data.Akshan.stats.crit data.Akshan.stats.critperlevel \
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
.. ... ...
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
data.Akshan.stats.attackdamage data.Akshan.stats.attackdamageperlevel \
0 52 3.5
0 52 3.5
0 52 3.5
0 52 3.5
0 52 3.5
.. ... ...
0 52 3.5
0 52 3.5
0 52 3.5
0 52 3.5
0 52 3.5
data.Akshan.stats.attackspeedperlevel data.Akshan.stats.attackspeed \
0 4 0.638
0 4 0.638
0 4 0.638
0 4 0.638
0 4 0.638
.. ... ...
0 4 0.638
0 4 0.638
0 4 0.638
0 4 0.638
0 4 0.638
data.Aatrox.tags data.Ahri.tags data.Akali.tags data.Akshan.tags
0 Fighter Mage Assassin Marksman
0 Fighter Mage Assassin Assassin
0 Fighter Mage Assassin Marksman
0 Fighter Mage Assassin Assassin
0 Fighter Mage Assassin Marksman
.. ... ... ... ...
0 Tank Assassin Assassin Assassin
0 Tank Assassin Assassin Marksman
0 Tank Assassin Assassin Assassin
0 Tank Assassin Assassin Marksman
0 Tank Assassin Assassin Assassin
[8192 rows x 160 columns]
然后,您可以根據需要對其進行過濾:
listOfNumbers = ['266', '166', '123', '283']
df_sub = df[df['data.Aatrox.key'].isin(listOfNumbers)]
uj5u.com熱心網友回復:
這是一個適用于您的 json 的檔案,我已對其進行了更新以使其有效。
d = json.loads(j)
nums = [266, 166, 123, 283]
names = [v["name"] for v in d["data"].values() if int(v["key"]) in nums]
int如果您想匹配數字,您還必須使用您的值。
輸出
['Aatrox', 'Akshan']
uj5u.com熱心網友回復:
有很多解決方案你也可以試試這個我認為它非常適合你的解決方案
import json
#Load your json or manually declare your json here
with open('yourfile.json') as f:
Data= json.load(f)
#This the main code for accesing the value and get the result
Temp_Data=Data['data']
result_list=[]
listOfNumbers =[266,166,123,283]
for data,data_info in Temp_Data.items():
key_value=int(Temp_Data[data]['key'])
if key_value in listOfNumbers:
result_list.append(data)
print(result_list)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/416641.html
標籤:
