我需要一个函数(我们称之为list(n))来创建一个包含两个假值后跟n-1个真值的列表,是否可以使用包含两个语句的列表推导?我需要能够使用像 list(n)[5] = true 这样的行来操作列表,除非我将函数分配给像 list(n) = list 这样的变量,否则它实际上不起作用。
下面是我的函数,我尝试将第四个值更改为 false,然后调用 list_true(5),但没有返回我期望的内容。只有在将函数输出分配给变量列表后,它才做了我想要的(第四项需要从 true 更改为 false)。
def list_true(n):
return [False for i in range(2)] + [True for i in range(n-1)]
list_true(5)[3] = False
list_true(5)
list_true(5) = list
list[3] = False
你的问题与你的列表理解无关。您的列表理解工作正常。你的问题是你误解了函数的工作原理。
调用函数会创建一个列表。调用它两次会创建两个列表。修改第一个列表不会对第二个列表执行任何操作。您不能只是一遍又一遍地调用list_true(5)
,并期望更改从一个列表保留到完全不同的列表。
您需要创建一个列表并保留它,方法是将函数输出分配给变量并使用该变量。从你的问题来看,你似乎已经意识到这是可行的(尽管你在发布时把它倒过来了)。使用变量。
不建议尝试实现的目标:不期望list_true
的返回值是引用。
但是,有可能:
>>> def list_true(n, list_by_n={}):
... return list_by_n.setdefault(n, [False, False] + [True]*(n-1))
...
>>> list_true(5)
[False, False, True, True, True, True]
>>> list_true(5)[3] = False
>>> list_true(5)
[False, False, True, False, True, True]
这是它的工作原理。首先,list_true
有一个具有默认值的参数。此默认值仅在首次调用函数时使用一次,然后存储在函数状态中。然后,使用setdefault
,我们寻找映射到键n
的值,如果存在,则返回它。否则,映射到n
的值将设置为[False, False] + [True]*(n-1)
(初始值)并返回。总结一下:如果列表不存在,list_true
将创建列表,然后始终返回相同的引用。
但这是一个把戏。你可以得到相同的结果,但有一个类更清晰的设计:
>>> class ListStore:
... def __init__(self):
... self._list_by_n = {}
...
... def get(self, n):
... return self._list_by_n.setdefault(n, [False, False] + [True]*(n-1))
后缀Store
(您可能会找到更好的后缀)旨在指示类的实例将返回引用。
>>> list_store = ListStore()
>>> list_store.get(5)
[False, False, True, True, True, True]
>>> list_store.get(5)[3] = False
>>> list_store.get(5)
[False, False, True, False, True, True]
函数输出分配给变量列表后,它才做我想做的事情(第四项需要从真更改为假)。
右。这就是Python的工作方式。无论返回值是列表推导式、通过连接两个列表创建的列表表达式,还是使用循环生成的新列表,每个函数调用都会生成一个新列表。调用该函数一次,将其分配给一个变量,正如您所发现的,事情就会起作用。
是否可以使用包含两个语句的列表理解?
取决于你所说的"两个陈述"是什么意思。一般来说,你可以写这样的东西
[x + y for x in range(3) for y in range(5)]
但是在理解中有两个for
条件本质上是两个嵌套循环,我认为在您的情况下,您并不要求嵌套。你只是在寻找两个假和多个跟在假之后的真。你的表情,有两个独立的理解,很好。
旁白:另一种制作具有两个False
和其余True
的可变列表的方法,您可以使用以下表达式避免理解,这很有趣:
[False, False, *([True] * (n-1))]
这有点惯用,但从外面看就像一个单一的列表,你可能会觉得不错。
使用*
运算符,如下所示:
法典:
N = 6
x = [True] * N
x[:2] = [False] * 2
print(x)
结果:
[False, False, True, True, True, True]
这应该可以做到:
[x>1 for x in range(n-1)]