Как преобразовать это для цикла:
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'
Используйте только sum(smoke_ray)
Пожалуйста, обновите свой вопрос с полной трассировкой ошибок.
За исключением неуместного использования, первая часть понимания списка должна быть выражением. +=
, однако, не является оператором и не может быть частью выражения. Это часть синтаксиса расширенного оператора присваивания.
Если я попробую то, что вы предложили @toRex, что я пробовал до того, как я получу эту ошибку: TypeError: unsupported operand type(s) for +: 'int' and 'dict'
@chepner, мне лучше использовать цикл лямбда-функции? Я пробовал это и просто не могу понять это
Что вы подразумеваете под «циклом лямбда-функции»?
@chepner Мне надоело использовать циклы for, я думал, что смогу использовать рекурсивную лямбда-функцию для выполнения цикла for вместо этого, но я просто застрял
Вам даже не нужно понимание списка. Просто используйте сумму :
total = sum(smoke_ray)
См. полный код и ошибку при попытке использовать sum
Если вы хотите увидеть список значений суммы, вы можете использовать
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
не работает
Вы можете сделать это несколькими способами, так как вы просите здесь 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)
Таким образом, вы можете суммировать значения, как хотите, в одном цикле, без необходимости создавать другой список/использовать понимание списка.
Спасибо и за подробное объяснение
Выражение понимания списка должно возвращать список. Какой список вы ожидаете, что это вернется?