Вопрос по python, list, dictionary – Python - сумма значений в словаре

47

У меня есть довольно простой список:

example_list = [
    {'points': 400, 'gold': 2480},
    {'points': 100, 'gold': 610},
    {'points': 100, 'gold': 620},
    {'points': 100, 'gold': 620}
]

Как я могу суммировать всеgold ценности? Я ищу хорошего приятеля.

Теперь я использую этот код (но это не лучшее решение):

total_gold = 0
for item in example_list:
    total_gold += example_list["gold"]
Вы правы, я использую это только для этого примера. Mateusz Jagiełło
@sigo - в этом случае существует хороший однострочный текст, но, как правило, он ограничивает ответы «хорошими однострочниками»; это, вероятно, плохая идея (поскольку могут существовать более приятные мультилинии). mgilson
Вы не должны использоватьlist в качестве имени локальной переменной - это скрывает встроеннуюlist типа и может вызвать проблемы. g.d.d.c

Ваш Ответ

3   ответа
113
sum(item['gold'] for item in myLIst)
Потрясающий приятель +1
бей меня к этому. (+1)
3

mapтоже работает

 import operator
 total_gold = sum(map(operator.itemgetter('gold'),example_list))

Но я думаю, что генератор, размещенный g.d.d.c, значительно лучше. Этот ответ на самом деле просто чтобы указать на существованиеoperator.itemgetter.

@Filipq - хороший.
_reduce = lambda fn, ar: fn( ar[0], _reduce(fn, ar[1:])) if len(ar) > 1 else ar[0] total_gold = _reduce((lambda x, y: x + y), (lambda fn, ar: [fn(ar[i]) for i in xrange(len(ar))])( (lambda x: x["gold"]), example_list))       Я также думаю, что ответ g.d.d.c является хорошим. Этот ответ действительно просто, чтобы указать на существование лямбда: P
спасибо - кажется, что форматирование комментариев не учитывает переводы строки, поэтому выглядит даже хуже, чем следовало бы.
@Filipq - Действительно, я отправил тот же ответ, что и g.d.d.c через 30 секунд после того, как он это сделал. Я изначально удалил его, но с тех пор, как получил дурацкие инструменты модератора, я все еще вижу свой удаленный ответ. Меня это беспокоило, так что я подумал про себя, что должен быть другой, несколько чистый способ сделать это, который иллюстрирует что-то полезное ... Я, вероятно, должен просто удалить это, хотя ... Я не знаю. (Я открыт для предложений).
11

sum(item['gold'] for item in example_list)

Если вы очень сознательны во времени:

sum([item['gold'] for item in example_list])

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

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

Увидетьэтот ответ для некоторых реальных временных сравнений понимания списка с выражениями генератора.

Полезно знать, спасибо. Mateusz Jagiełło

Похожие вопросы