Вопрос по python, list, dictionary – Python - сумма значений в словаре
У меня есть довольно простой список:
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
ответа
map
тоже работает
import operator
total_gold = sum(map(operator.itemgetter('gold'),example_list))
Но я думаю, что генератор, размещенный g.d.d.c, значительно лучше. Этот ответ на самом деле просто чтобы указать на существованиеoperator.itemgetter
.
_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 секунд после того, как он это сделал. Я изначально удалил его, но с тех пор, как получил дурацкие инструменты модератора, я все еще вижу свой удаленный ответ. Меня это беспокоило, так что я подумал про себя, что должен быть другой, несколько чистый способ сделать это, который иллюстрирует что-то полезное ... Я, вероятно, должен просто удалить это, хотя ... Я не знаю. (Я открыт для предложений).
sum(item['gold'] for item in example_list)
Если вы очень сознательны во времени:
sum([item['gold'] for item in example_list])
В большинстве случаев просто используйте выражение генератора, поскольку увеличение производительности заметно только при очень большом наборе данных / очень горячем пути кода.
Увидетьэтот ответ для объяснения того, почему вы должны избегать использования карты.
Увидетьэтот ответ для некоторых реальных временных сравнений понимания списка с выражениями генератора.
Полезно знать, спасибо.
Mateusz Jagiełło
Похожие вопросы
Вы правы, я использую это только для этого примера.
@sigo - в этом случае существует хороший однострочный текст, но, как правило, он ограничивает ответы «хорошими однострочниками»; это, вероятно, плохая идея (поскольку могут существовать более приятные мультилинии).
Вы не должны использовать<code>list</code> в качестве имени локальной переменной - это скрывает встроенную<code>list</code> типа и может вызвать проблемы.