2016-05-26 6 views
0

Я бы создал более конкретное название, но не знаю, как сформулировать мой вопрос.Python 3: Итерация по словарю

{ 
    "playerStatSummaries": [ 
     { 
     "playerStatSummaryType": "AramUnranked5x5", 
     "aggregatedStats": { 
      "totalChampionKills": 2250, 
      "totalAssists": 6199, 
      "totalTurretsKilled": 114 
     }, 
     "modifyDate": 1463737953000, 
     "wins": 211 
     }, 
     { 
     "playerStatSummaryType": "RankedSolo5x5", 
     "aggregatedStats": { 
      "totalNeutralMinionsKilled": 928, 
      "totalMinionKills": 15346, 
      "totalChampionKills": 522, 
      "totalAssists": 459, 
      "totalTurretsKilled": 129 
     }, 
     "losses": 35, 
     "modifyDate": 1464273041000, 
     "wins": 44 
     }, 
     { 
     "playerStatSummaryType": "URF", 
     "aggregatedStats": { 
      "totalNeutralMinionsKilled": 100, 
      "totalMinionKills": 1379, 
      "totalChampionKills": 138, 
      "totalAssists": 125, 
      "totalTurretsKilled": 25 
     }, 
     "modifyDate": 1463946086000, 
     "wins": 10 
     } 
    ], 
    "summonerId": 85058811 
} 

Я хотел бы перебирать этот словарь, пока не дойду до «побед»: 44 пары ключ/значение. Мне нужно динамически достичь этого, потому что json-файл не всегда имеет одинаковое количество записей, поэтому индекс не всегда одинаковый.

Я знаю, как просто перебирать ключи:

for key in ranked_stats_json.keys(): 
    if key == "playerStatSummaries": 
     print("reached") 

, но тогда я не знаю, как перебирать ключи снова, потому что есть еще один набор значений ключа/пара в пределах «playerStatSummaries» блок.

Я также не понимаю, почему значения ключа/пары здесь имеют несколько значений, например «playerStatSummaryType:» RankedSolo5x5, «aggregatedStats». Я думал, что для каждого ключа может быть только одно значение.

Итак, как я могу динамически достичь «выигрышей»: 44 пары ключ/значение в блоке «RankedSolo5x5», если я не знаю, сколько записей (блоков, как я их называю) будет, когда я получите этот файл.

Прошу прощения, если этот вопрос кажется неопределенным, потому что я довольно запутан, как решить эту проблему, но скажите мне, требуется ли дополнительная информация.

+0

'playerStatSummaryType' имеет только одно значение. «aggregatedStats» имеет двоеточие после него, что означает, что это отдельный ключ, а не другое значение 'playerStatSummaryType' –

+0

« Я также не понимаю, почему значения ключа/пары здесь имеют несколько значений, например «playerStatSummaryType:» RankedSolo5x5 , «aggregatedStats». --- ** Они не являются **. Ключ: * playerStatSummaryType *, значение равно * RankedSolo5x5 *, следующий ключ - * aggregatedStats *, следующее значение - словарь. – Craicerjack

+0

Вам нужно только wins/44 pair или вам нужны все «победы»? – Andy

ответ

0

В этом синтаксисе {} указывает словарь, а [] указывает список или массив.

У вас есть {, поэтому ваш внешний элемент данных - это словарь.Главный ключ, кажется "playerStatSummaries" так давайте доступ, что непосредственно:

data['playerStatSummaries'] 

Теперь, playerStatSummaries список/массив элементов, поэтому мы должны либо перебрать его, или использовать номер индекса в него , Вы сказали, что количество/порядок варьируется, поэтому мы будем перебирать список.

stats = [summ for summ in data['playerStatSummaries']] 

Это создает новый список с помощью list comprehension, который только содержит те же элементы, что и список внутри структуры данных. Но мы можем идти дальше!

Каждый summ элемент сам по себе словарь с такими ключами, как 'wins': 44 или "playerStatSummaryType": "RankedSolo5x5". Таким образом, мы можем использовать if clause особенность списка нашего понимания, чтобы отфильтровать элементы, которые вы хотите:

stats = [summ for summ in data['playerStatSummaries'] if summ['wins'] == 44] 

или, возможно, лучший подход:

stats = [summ for summ in data['playerStatSummaries'] if summ['playerStatSummaryType'] == 'RankedSolo5x5'] 

Теперь вы будете иметь список всех элементов с 44 ​​победами или где тип RankedSolo5x5.

Скорее всего, у вас будет только один элемент. Вы можете сохранить список, и получить доступ к нему, как это:

wins = stats[0]['wins'] 

Или вы могли бы просто захватить 0'th элемент в то время как вы делали понимание:

stat = [summ for summ in ... 'RankedSolo5x5'][0] 
wins = stats['wins'] 
+0

Спасибо, вы предоставили рабочий пример с некоторыми хорошими пошаговыми пояснениями. Время для меня читать по спискам. – Kristoffer

0

Попробуйте что-то вроде:

for item in ranked_stats_json['playerStatSummaries']: ##This iterates the list 
    if 'wins' in item and item['wins'] == 44: ##This checks your condition 
     ##Do whatever here, or break or whatever you want #Put your action here 

Рассмотрим следующий пример:

{ 'Dictvalue1':[ 
    { 
    'List1key1': 'List1Value1, 
    'list1key2': 'list1Value2 
    }, 
    { 
    'ListItem2key1': 'ListItem2Value1, 
    'listItem2key2': 'listItem2Value2 
    } 
]} 

Обычно в словаре вы ссылка на ключ и список положением. То же самое происходит при вложенности.

Так что если вы хотите, чтобы ссылаться на ListItem2Value1 вы бы поставил:

variable_holding_this_structure['Dictvalue1'][1]['listItem2key1'] 

Поскольку ключ «Dictvalue1» содержит список в качестве значения. В списке вы хотите указать позицию 1 (второй словарь, включенный в список). В словаре, хранящемся в позиции 1 списка, вы хотите получить значение, связанное с ключом «listItem2key1»

Это означает, что вы можете выполнять итерацию по любому уровню этого нормали, указав уровень вложенности, который вы используете, или вложенность для петель

for item in variable['Dictvalue1'][1]: 
    #do something 

for item in variable: 
    for subitem in item: 
     for subsubtitem in subitem: 
     #do something 
0

Вы можете перебирать статистику с помощью List Comprehension

wins = [x['wins'] for x in data['playerStatSummaries']] 
print(wins) 
>>> [211, 44, 10] 
0

Используйте if условие на список понимания:

win_dict = [{'wins': x['wins']} for x in json_data['playerStatSummaries'] if x['playerStatSummaryType'] == 'RankedSolo5x5'] 
# [{'wins': 44}] 
0

Вы можете использовать рекурсивную функцию как это:

def get_wins(obj): 
    wins = [] 
    if isinstance(obj, list): 
     for val in obj: 
      if isinstance(val, (dict, list)): 
       return_val = get_win(val) 
       if return_val: 
        wins.extend(return_val) 
    elif isinstance(obj, dict): 
     for name, val in obj.items(): 
      if name == 'wins': 
       wins.append(val) 
      if isinstance(val, (dict, list)): 
       return_val = get_win(val) 
       if return_val: 
        wins.extend(return_val) 
    return wins 

Затем, если вы используете get_wins(ranked_stats_json), то выход будет [211, 44, 10].

Перк об этом, независимо от содержания, если он имеет ключ wins в любом месте, вы бы его получили.

Смежные вопросы