Понимание списка += оператор

Как преобразовать это для цикла:

smoke_ray = [18, 14]
total = 0 
for i in smoke_ray: 
    total += i

В понимание списка? Я пытался:

smoke_ray = [18, 14]
total = 0 
[total += i for i in smoke_ray]

Проблема в операторе +=? вот у меня ошибка

Обновлено с полным кодом:

days = [
    { "day_name": "wed",
      "smoked_at": {
        '15:30': 1,
        '16:30': 1,
        '16:50': 2,
        '17:30': 1,
        '18:30': 1,
        '20:20': 1,
        '21:30': 1,
        '22:30': 1,
        '25:00': 5
        }
    },
    { "day_name": "thurs",
        "smoked_at": {
        '08:15': 1,
        '08:40': 1,
        '09:20': 1,
        '10:00': 1,
        '11:20': 1,
        '11:38': 1, 
        '12:10': 1,
        '13:00': 1,
        '14:26': 1,
        '15:40': 1, 
        '17:08': 1,
        '18:10': 1,
        '19:30': 1,
        '20:20': 1,
        '22:00': 1,
        '23:00': 1,
        '25:00': 2
        }
    }
]

smoke_ray = []

for i in days:
    print(i["day_name"])
    smokes = i["smoked_at"].values()
    smokes_day = sum(smokes)
    print(smokes_day)
    smoke_ray.append(i)

total = 0 
for i in smoke_ray: 
    total += i 
print(total)

При попытке преобразовать последний цикл for в понимание списка (вы говорите мне, что это не сокращенный способ написания цикла? Я слышал, что это было быстрее)

Я получаю эту ошибку:

File "compiler.py", line 47
    [total += i for i in smoke_ray]
            ^
SyntaxError: invalid syntax

При попытке использовать sum это просто не сработает: sum(smoke_ray)


wed
14
thurs
18
Traceback (most recent call last):
  File "compiler.py", line 47, in 
    sum(smoke_ray)
TypeError: unsupported operand type(s) for +: 'int' and 'dict'

Выражение понимания списка должно возвращать список. Какой список вы ожидаете, что это вернется?

Eugene Sh. 11.12.2020 20:33

Используйте только sum(smoke_ray)

mhhabib 11.12.2020 20:33

Пожалуйста, обновите свой вопрос с полной трассировкой ошибок.

quamrana 11.12.2020 20:36

За исключением неуместного использования, первая часть понимания списка должна быть выражением. +=, однако, не является оператором и не может быть частью выражения. Это часть синтаксиса расширенного оператора присваивания.

chepner 11.12.2020 20:37

Если я попробую то, что вы предложили @toRex, что я пробовал до того, как я получу эту ошибку: TypeError: unsupported operand type(s) for +: 'int' and 'dict'

Nickotine 11.12.2020 20:37

@chepner, мне лучше использовать цикл лямбда-функции? Я пробовал это и просто не могу понять это

Nickotine 11.12.2020 20:46

Что вы подразумеваете под «циклом лямбда-функции»?

chepner 11.12.2020 20:47

@chepner Мне надоело использовать циклы for, я думал, что смогу использовать рекурсивную лямбда-функцию для выполнения цикла for вместо этого, но я просто застрял

Nickotine 11.12.2020 20:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
8
178
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вам даже не нужно понимание списка. Просто используйте сумму :

total = sum(smoke_ray)

См. полный код и ошибку при попытке использовать sum

Nickotine 11.12.2020 20:47

Если вы хотите увидеть список значений суммы, вы можете использовать

import itertools
smoke_ray = [18, 14]
print(list(itertools.accumulate(smoke_ray)))

Это покажет вам сумму ряда по элементу

Выход

[18, 32]

Понимание списка — это, в частности, операция по преобразованию входного списка в выходной список с помощью двух действий:

  • преобразование каждого элемента (также известное как «отображение»)
  • фильтрация по некоторому критерию фильтрации

Вот и все.

Нужная вам операция принципиально отличается: вы хотите накапливать элементы в списке, используя заданную операцию. Это действие также известно как «сокращение» и доступно в библиотеке Python через functools.reduce.

Таким образом, вы могли бы написать

import functools
import operator

functools.reduce(operator.add, smoke_ray)

… но это настолько распространенная операция, что для нее есть сокращение: как уже упоминалось, вы также можете просто использовать sum(smoke_ray).

Посмотреть полный код Я схожу с ума, почему sum не работает

Nickotine 11.12.2020 20:48

Вы можете сделать это несколькими способами, так как вы просите здесь list comprehension (хотя понимание списка здесь плохой вариант, вариант с батареей sum(your_list) ), попробуйте следующее:

sum([i for i in [18, 14]])
24
Ответ принят как подходящий

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

Я думаю, проблема в строке smoke_ray.append(i): Здесь вы добавляете целый элемент словаря (например: { "day_name": "...", "smoked_at": { ... } }) в список smoke_ray. Тогда нет смысла суммировать значения в этом списке, поскольку они являются словарями. Если вы хотите добавить каждый smokes_day в список, а затем суммировать их, вы должны сделать smoke_ray.append(smoke_day) в этом цикле. Затем вы сможете просто использовать sum, как указано в других ответах, для суммирования по списку.

Обновлено: это не означает, что в коде больше нет улучшений, которые можно было бы внести в код, простое изменение, которое сохранило бы исходную структуру, состояло бы в том, чтобы изменить цикл for примерно так:

total = 0
for i in days:
    print(i['day_name'])
    smokes = i['smoked_at'].values()
    smokes_day = sum(smokes)
    print(smokes_day)
    total += smokes_day

print(total)

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

Спасибо и за подробное объяснение

Nickotine 13.12.2020 10:49

Другие вопросы по теме