是否可以使用列表理解来模拟 sum() 之类的东西?
例如 - 我需要计算列表中所有元素的乘积:
list = [1, 2, 3]
product = [magic_here for i in list]
#product is expected to be 6
执行相同操作的代码:
def product_of(input):
result = 1
for i in input:
result *= i
return result
是否可以使用列表理解来模拟 sum() 之类的东西?
例如 - 我需要计算列表中所有元素的乘积:
list = [1, 2, 3]
product = [magic_here for i in list]
#product is expected to be 6
执行相同操作的代码:
def product_of(input):
result = 1
for i in input:
result *= i
return result
不; 列表推导式生成一个与其输入一样长的列表。您将需要 Python 的其他功能工具之一(特别reduce()
是在本例中)将序列折叠为单个值。
>>> from functools import reduce
>>> from operator import mul
>>> nums = [1, 2, 3]
>>> reduce(mul, nums)
6
Python 3 黑客
关于诸如[total := total + x for x in [1, 2, 3, 4, 5]]
这是一个可怕的想法。使用列表推导进行模拟的一般想法与sum()
列表推导的整个目的背道而驰。在这种情况下,您不应该使用列表推导。
在 Python中2.5
/2.6
您可以使用vars()['_[1]']
来引用当前正在构建的列表推导。这太可怕了,永远不应该使用,但它与您在问题中提到的最接近(使用列表组合来模拟产品)。
>>> nums = [1, 2, 3]
>>> [n * (vars()['_[1]'] or [1])[-1] for n in nums][-1]
6
从 开始Python 3.8
,并引入赋值表达式(PEP 572)(:=
运算符),我们可以在列表推导式中使用和递增变量,从而将列表简化为元素的总和:
total = 0
[total := total + x for x in [1, 2, 3, 4, 5]]
# total = 15
这个:
total
为0
total
由当前循环项目 ( total := total + x
)递增列表推导总是创建另一个列表,因此在组合它们时没有用(例如,给出一个数字)。此外,除非您非常狡猾,否则无法在列表理解中进行分配。
我唯一一次看到使用列表推导对 sum 方法有用的是,如果您只想在列表中包含特定值,或者您没有数字列表:
list = [1,2,3,4,5]
product = [i for i in list if i % 2 ==0] # only sum even numbers in the list
print sum(product)
或另一个例子”:
# list of the cost of fruits in pence
list = [("apple", 55), ("orange", 60), ("pineapple", 140), ("lemon", 80)]
product = [price for fruit, price in list]
print sum(product)
在列表理解中进行分配的超级偷偷摸摸的方式
dict = {"val":0}
list = [1, 2, 3]
product = [dict.update({"val" : dict["val"]*i}) for i in list]
print dict["val"] # it'll give you 6!
...但这太可怕了:)
像这样的东西:
>>> a = [1,2,3]
>>> reduce(lambda x, y: x*y, a)
6
我用一些使用reduce
Python 运算符的代码来补充 Ignacio Vazquez-Abrams 的答案。
list_of_numbers = [1, 5, 10, 100]
reduce(lambda x, y: x + y, list_of_numbers)
也可以写成
list_of_numbers = [1, 5, 10, 100]
def sum(x, y):
return x + y
reduce(sum, list_of_numbers)
奖励:Python 在内置函数中提供了此sum
功能。这是 imo 最易读的表达方式。
list_of_numbers = [1, 5, 10, 100]
sum(list_of_numbers)
>>> reduce(int.__mul__,[1,2,3])
6
C:\Users\Henry>python -m timeit -s "" "reduce(int.__mul__,range(10000))"
1000 loops, best of 3: 910 usec per loop
C:\Users\Henry>python -m timeit -s "from operator import mul" "reduce(mul,range(10000))"
1000 loops, best of 3: 399 usec per loop
C:\Users\Henry>
可以通过将 lambda 与列表推导一起使用来实现因为我们无法在列表推导中分配值,所以我们使用 lambda
解决方案:
>>> (lambda number_list, sum=0:[sum for number in number_list for sum in [sum + number]][-1])([1, 2, 3, 4, 5])
>>> 15
这次讨论我可能有点晚了,但我想提一下,列表理解已经完成,因此这可以通过列表理解来完成!
然而这很混乱,所以我使用了以下技巧,它创建了一个累积数组,并返回最后一个元素
def sum(l):
return [c[-1] for c in [[0]] for e in l if c.append(c[-1] + e) is None][-1]
在http://code.activestate.com/recipes/436482/上找到了魔法。
>>> L=[2, 3, 4]
>>> [j for j in [1] for i in L for j in [j*i]][-1]
24
应该是如下代码的逻辑。
L=[2, 3, 4]
P=[]
for j in [1]:
for i in L:
for j in [j*i]:
P.append(j)
print(P[-1])