是否可能有类似的内容:
list1 = ...
currentValue = 0
list2 = [currentValue += i, i for i in list1]
我试过但是没有用?编写这些语法的正确语法是什么?
编辑:print语句就是一个例子。实际上我在循环外增加一个值。
答案 0 :(得分:26)
语句不能进入Python中的表达式;这是一种故意用语言设计的复杂功能。对于这个问题,请尝试使用确实使其成为语言的复杂功能:generator。观看:
def total_and_item(sequence):
total = 0
for i in sequence:
total += i
yield (total, i)
list2 = list(total_and_item(list1))
生成器保持到目前为止看到的项目的运行记录,并将其作为每个项目的前缀,就像它看起来像您尝试做的那样。当然,一个简单的循环可能更简单,它在顶部创建一个空列表,只是调用append()很多! : - )
答案 1 :(得分:3)
我不太确定你要做什么,但它可能就像
list2 = [(i, i*2, i) for i in list1]
print list2
列表解析中的语句必须是单个语句,但您始终可以将其作为函数调用:
def foo(i):
print i
print i * 2
return i
list2 = [foo(i) for i in list1]
答案 2 :(得分:2)
答案 3 :(得分:2)
正如pjz所说,你可以使用函数,所以在这里你可以使用闭包来跟踪计数器值:
# defines a closure to enclose the sum variable
def make_counter(init_value=0):
sum = [init_value]
def inc(x=0):
sum[0] += x
return sum[0]
return inc
然后你用list1:
做你想做的事list1 = range(5) # list1 = [0, 1, 2, 3, 4]
现在只有两行,我们得到list2:
counter = make_counter(10) # counter with initial value of 10
list2 = reduce(operator.add, ([counter(x), x] for x in list1))
最后,list2包含:
[10, 0, 11, 1, 13, 2, 16, 3, 20, 4]
这是你想要的,你可以通过一次调用得到循环后的计数器值:
counter() # value is 20
最后,您可以通过任何类型的操作来替换闭包,这里我们有一个增量,但这取决于您。 另请注意,我们使用reduce来展平list2,这个小技巧要求您在使用reduce调用行之前导入 operator :
import operator
答案 4 :(得分:1)
首先,您可能不想使用print
。它不会返回任何内容,因此如果您只想打印出来,请使用传统的for
循环。你在寻找的是:
>>> list1 = (1,2,3,4)
>>> list2 = [(i, i*2) for i in list1] # Notice the braces around both items
>>> print(list2)
[(1, 2), (2, 4), (3, 6), (4, 8)]
答案 5 :(得分:1)
在列表理解中调用打印是一件奇怪的事情。如果您向我们展示了您想要的输出,而不仅仅是不起作用的代码,它会有所帮助。
以下是两个猜测。无论哪种方式,重要的一点是列表推导中的值语句必须是单个值。您不能一次插入多个项目。 (如果这是你想要做的,请跳到第二个例子。)
list1 = [1, 2, 3]
list2 = [(i, i*2, i) for i in list1]
# list2 = [(1, 2, 1), (2, 4, 2), (3, 6, 3)]
获得一个单一的列表:
list1 = [1, 2, 3]
tmp = [(i, i*2) for i in list1]
list2 = []
map(list2.extend, tmp)
# list2 = [1, 2, 1, 2, 4, 2, 3, 6, 3]
编辑: 增加列表理解中间的值仍然很奇怪。如果你真的需要这样做,那么你最好只编写一个常规的for循环,然后随意附加值。在Python中,像这样的聪明几乎总是被称为“unpythonic”。如果你必须这样做,但你会在这样的论坛中得不到任何结果。 ;)
答案 6 :(得分:1)
对于您编辑过的示例:
currentValue += sum(list1)
或:
for x in list1:
currentValue += x
列表理解很棒,我很喜欢它们,但是简单的for
循环并没有错,你不应该害怕使用它: - )
编辑:“但是,如果我想增加不同于收集的值,该怎么办?”
那么,你想要增加什么?你掌握了python的全部功能!
增加x平方?
for x in list1:
currentValue += x**2
增加x的某些函数及其在列表中的位置?
for i, x in enumerate(list1):
currentValue += i*x
答案 7 :(得分:1)
为什么要创建重复列表。似乎列表理解所做的只是总结内容。
为什么不呢。
list2 = list(list1) #this makes a copy
currentValue = sum(list2)
答案 8 :(得分:0)
您不能执行多个语句,但可以执行函数调用。要做你上面想要的事情,你可以这样做:
list1 = ...
list2 = [ (sum(list1[:i], i) for i in list1 ]
一般来说,因为列表推导是python“功能”部分的一部分,所以你只能使用...函数。其他人建议你可以在必要时编写自己的函数,这也是一个有效的建议。