Python 列表理解+;=操作人员

Python 列表理解+;=操作人员,python,for-loop,list-comprehension,Python,For Loop,List Comprehension,如何转换此for循环: 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",

如何转换此for循环:

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(烟光)


你甚至不需要一份清单。只需使用:


如果您想查看总和值列表,那么可以使用

import itertools
smoke_ray = [18, 14]
print(list(itertools.accumulate(smoke_ray)))
这将按元素显示序列的总和

输出

[18, 32]

列表理解是通过两个操作将输入列表转换为输出列表的操作:

  • 每个元素的转换(也称为“映射”)
  • 基于某种滤波准则的滤波
就这样

您想要的操作与此完全不同:您想要使用给定的操作在列表中累积元素。此操作也称为“reduce”,可通过
functools.reduce在Python库中找到

这样你就可以写作了

import functools
import operator

functools.reduce(operator.add, smoke_ray)

…但这是一个非常常见的操作,因此有一个简写:如前所述,您也可以使用
sum(smoke\u ray)
您可以通过多种方式来完成,因为您在这里要求
列表理解
(虽然列表理解在这里是一个不好的选项,但电池选项是
sum(您的列表)
)试试这个:

sum([i for i in [18, 14]])

看看您现在为上下文添加的代码,我认为您遇到的问题实际上不是对列表求和,而是构建列表本身。当我使用for循环运行您的原始代码时,我也会失败

我认为问题出在
smoke\u-ray.append(I)
:在这里,您将字典的整个元素(例如:
{“day\u name”:“…”,“smoked\u at”:{…}
)添加到
smoke\u-ray
列表中。然后,对列表中的值求和是没有意义的,因为它们是字典。如果您想将每个
smokes\u day
添加到列表中,然后对它们求和,您可以在该循环中执行
smoke\u ray.append(smoke\u day)
。然后,您应该能够使用其他答案中提到的
sum
对列表进行求和

编辑:这并不是说对代码没有更多的改进,顺便说一句,保留原始结构的简单更改是将for循环更改为如下内容:

total=0
对于我来说,在几天内:
打印(i['day_name'])
smokes=i['smoked_at'].值()
吸烟天数=总和(吸烟)
打印(每天吸烟)
总数+=每天吸烟
打印(总计)

这样,您就可以在一个循环中对值求和,而无需构建另一个列表/使用列表理解。

列表理解表达式应该返回一个列表。您希望返回什么类型的列表?仅使用
sum(smoke\u-ray)
请使用完整的错误回溯更新您的问题。除了不适当的使用之外,列表理解的第一部分必须是表达式<但是,代码>+=
不是运算符,不能是表达式的一部分。这是增广赋值语句语法的一部分suggested@toRex在出现此错误之前我已尝试过:
TypeError:不支持的操作数类型对于+:“int”和“dict”
请参阅完整代码和尝试使用
sum时出现的错误
请参阅完整代码我不明白为什么
sum
不能在银行使用以及详细解释
import functools
import operator

functools.reduce(operator.add, smoke_ray)
sum([i for i in [18, 14]])
24