我需要创建一个可变列表,从两个假值开始,然后继续用真值到N,我可以使用列表推导吗?



我需要一个函数(我们称之为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)]

最新更新