如何在Python中保存列表理解中的重复计算?

如何在Python中保存列表理解中的重复计算?,python,python-3.x,list-comprehension,Python,Python 3.x,List Comprehension,在以下Python代码中: keyboards = [3, 1] drivers = [5, 2, 8] upper_limit = 10 sums = [k + d for k in keyboards for d in drivers if (k + d) <= upper_limit] 但是我希望避免append的副作用操作。只有for循环可以在列表理解中分配给新名称,因此如果需要“局部”变量来引用计算,则需要找到添加额外循环的方法 您可以在计算k+d的单个元素元组上添加另一个循环

在以下Python代码中:

keyboards = [3, 1]
drivers = [5, 2, 8]
upper_limit = 10
sums = [k + d for k in keyboards for d in drivers if (k + d) <= upper_limit]

但是我希望避免append的副作用操作。

只有
for
循环可以在列表理解中分配给新名称,因此如果需要“局部”变量来引用计算,则需要找到添加额外循环的方法

您可以在计算
k+d
的单个元素元组上添加另一个循环:

sums = [kd for k in keyboards for d in drivers for kd in (k + d,) if d <= upper_limit]
sums=[kd表示键盘中的k表示键盘中的d表示驱动器中的kd表示键盘中的kd表示(k+d),如果d表示键盘=[3,1]
>>>驱动因素=[5,2,8]
>>>上限=10
>>>[kd表示kd表示kd表示kd表示kd表示kd表示kd表示kd表示kd表示kd表示kd表示kd表示kd表示kd表示kd表示k表示kd表示k表示kd表示k表示kd表示k表示kd表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k表示k

>>>[kd for kd in kd_calc if kd@agtoever:对于给定的样本输入,单元组循环稍微快一些(1.11s vs 1.26s,用于100万次迭代)。我还没有使用更大的输入进行测试。感谢您提供了优雅的解决方案!(k+d,)的概念是什么?它似乎是生成器的简写(k+d代表键盘中的k代表驱动程序中的d)@YuShen:它是一个只有一个元素的元组;逗号使它成为元组,括号只是用来消除逗号的其他可能用法的歧义。你也可以使用一个列表:
在[k+d]
中代表kd。一个元素在一个iterable上的循环只迭代一次。
sums = [kd for k in keyboards for d in drivers for kd in (k + d,) if d <= upper_limit]
sums = [kd for kd in (k + d for k in keyboards for d in drivers) if kd <= upper_limit]
kd_calc = (k + d for k in keyboards for d in drivers)
sums = [kd for kd in kd_calc if kd <= upper_limit]
>>> keyboards = [3, 1]
>>> drivers = [5, 2, 8]
>>> upper_limit = 10
>>> [kd for k in keyboards for d in drivers for kd in (k + d,) if d <= upper_limit]
[8, 5, 11, 6, 3, 9]
>>> [kd for kd in (k + d for k in keyboards for d in drivers) if kd <= upper_limit]
[8, 5, 6, 3, 9]
>>> kd_calc = (k + d for k in keyboards for d in drivers)
>>> [kd for kd in kd_calc if kd <= upper_limit]
[8, 5, 6, 3, 9]