2016-08-17 2 views
2

Это вопрос, основанный на вложенных словарях.Найти сумму значений в пределах значений вложенного словаря

Нам предоставляется вложенный словарь, в котором во внешнем словаре указано имя совпадения, а значение для совпадений - это другой словарь с его ключом и значениями соответственно, а имя функции - orangecap(d), которое принимает словарь в нижнем формате.

Вот образец.

d = {'match1':{'player1':57, 'player2':38}, 'match2':{'player3':9, 'player1':42}, 'match3':{'player2':41, 'player4':63, 'player3':91}} 

Поэтому я хотел бы найти ключ игрока и рассчитать общую сумму для каждого игрока и вернуть наибольшую сумму.

Так что выход должен быть ('player3', 100)

Это то, что я пытался до сих пор, но безрезультатно:

def orangecap(d): 
    total=0 
    for key,value in d.items(): 
     for value in d.items(): 
      if d[key] in d.keys(): 
       total = total+d[value] 
      return(d[key],max(total)) 

ответ

1

Что-то, как это должно работать:

def orangecap(d): 
    players = {} 
    for match, scores in d.iteritems(): 
     for player, score in scores.iteritems(): 
      if player not in players: 
       players[player] = score 
      else: 
       players[player] += score 
    return sorted(players.items(), key=lambda x: x[1])[-1] 

Это создает словарь (players), содержащий общий балл игрока. Затем он сортирует предметы из словаря с помощью оценки и возвращает наивысший результат.

0

Вот возможное решение:

from collections import defaultdict 

data = { 
    'match1': {'player1': 57, 'player2': 38}, 
    'match2': {'player3': 9, 'player1': 42}, 
    'match3': {'player2': 41, 'player4': 63, 'player3': 91} 
} 


def orangecap(d): 
    result = defaultdict(int) 
    for k, v in data.items(): 
     for k1, v1 in v.items(): 
      result[k1] += v1 

    return sorted(result.items(), key=lambda x: x[1])[-1] 

print(orangecap(data)) 
+0

Вы можете использовать 'defaultdict (Int)' иметь значение по умолчанию 0 вместо лямбда :) – Karin

+0

@Karin О, это круто, ты прав, ТНХ! – BPL

3

Это немного измененный ответ взят из предыдущих ответа mine.

def find_totals(d): 
    total = {} 
    for match, results in d.items(): 
     for player, score in results.items(): 
      total[player] = total.get(player, 0) + score 
    highest_score = max(total, key=total.get) 
    return highest_score, total[highest_score] 

Пример вывода:

>>> d = {'match1':{'player1':57, 'player2':38}, 'match2':{'player3':9, 'player1':42}, 'match3':{'player2':41, 'player4':63, 'player3':91}} 
>>> print find_totals(d) 
('player3', 100) 

Так что происходит с вашим кодом ?, Давайте рассмотрим алгоритм:

Во-первых, вы итерацию по элементам (ключи/values ​​) от d. Это прекрасно, поскольку вы пытаетесь пересечь вложенную структуру словаря. Однако вместо того, чтобы обход внутренней структуры наиболее используя вторую петлю (forПеребораvalue, вместо того, чтобыd), вы вместо того, чтобы пройти d снова.

value теперь просто кортеж из ключа/значения магазинов в d, а не вложенный словаря. d[key] - это просто значение, отображаемое на клавиши соответствия. Итак, как же тогда можно было бы найти в списке ключей value ->d.keys() Условие if никогда не оценивается до true.Несмотря на это, вы закончили короткое замыкание всей итерации на return после двух итераций. Который не возвращает правильного игрока (d[key]- это вложенный словарь), а max принимает итерируемый аргумент, а не int.

Вы должны узнать больше об основных потоках управления, структурах данных и алгоритме. Я бы предложил отличный от Google python series.

+0

Не могли бы вы рассказать мне, что я делал неправильно с моим кодом? –

+0

Конечно, я скоро обновлю свой ответ @Dhruv Marwha – ospahiu

+0

@DhruvMarwha, Если вы думаете, что я ответил на ваш вопрос, не стесняйтесь отмечать как ответ. – ospahiu

0

Потому что кто-то должен был это сделать ... Вот один лайнер.

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

def total_score(*, match_results: dict, player_name: str): 
    return player_name, sum(score for player_scores in match_results.values() 
            for player, score in player_scores.items() 
            if player == player_name) 
Смежные вопросы