我对python很陌生,有一件事总是让我感到困惑,那就是当代码被挤成一行时。以以下内容为例:
def how_sum(targert_sum, numbers):
table = [None] * (targert_sum + 1)
table[0] = []
for i in range(targert_sum):
if table[i] is not None:
numbers = [num for num in numbers if i + num <= targert_sum]
for num in numbers:
table[i + num] = table[i] + [num]
return table[-1]
说numbers = [num for num in numbers if i + num <= targert_sum]
的那行把我弄糊涂了。我试着把它分解成一行,如下所示:
def how_sum(targert_sum, numbers):
table = [None] * (targert_sum + 1)
table[0] = []
for i in range(targert_sum):
if table[i] is not None:
for num in numbers:
if (i + num <= targert_sum):
numbers = [num]
for num in numbers:
table[i + num] = table[i] + [num]
return table[-1]
有人能解释我在哪里出错,也许显式地写出扩展嵌套的for-if语句吗?
编辑我认为提供一些问题背景可能会有所帮助。我要解决的是"如何求和"问题,而我正在自学一些算法。目标是有一个目标数(ex 7)和一个列表(ex[2,3]),并检查列表中的元素如何加到7 (so [2,2,3])
列表推导式相当于在结果变量后面追加。
但是result变量必须以空列表开始。由于结果变量与要迭代的变量相同,因此需要为结果使用不同的变量,然后可以将其复制到原始变量中(这实际上是在列表推导式内部发生的事情)。
def how_sum(targert_sum, numbers):
table = [None] * (targert_sum + 1)
table[0] = []
for i in range(targert_sum):
if table[i] is not None:
result = []
for num in numbers:
if (i + num <= targert_sum):
result.append(num)
numbers = result
for num in numbers:
table[i + num] = table[i] + [num]
return table[-1]
列表推导是一种生成新列表的方法。它允许您从任何可迭代对象创建列表。您可能想知道,既然我们有一个list()
函数,为什么还需要列表推导式。显然,列表推导式不仅用于将可迭代对象中的元素复制到列表中,而且主要用于以某种方式修改它们以创建特定的新列表。