gpt4 book ai didi

python - itertools 和跨步列表赋值

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:18 25 4
gpt4 key购买 nike

给定一个列表,例如x = [True]*20,我想将 False 分配给所有其他元素。

x[::2] = False

引发 TypeError:必须将可迭代分配给扩展切片

所以我天真地假设你可以做这样的事情:

x[::2] = itertools.repeat(False)

x[::2] = itertools.cycle([False])

但是,据我所知,这会导致无限循环。为什么会出现无限循环?是否有一种替代方法不涉及在分配之前知道切片中的元素数量?

编辑:我知道 x[::2] = [False] * len(x)/2 在这种情况下有效,或者您可以在在更一般的情况下是右侧。我试图了解是什么原因导致 itertools 无限循环,以及为什么列表分配的行为与 numpy 数组分配不同。我认为我对 python 一定有一些基本的误解。我也在想,最初可能出于性能原因,更喜欢 itertools 而不是列表理解或创建另一个 n 元素列表。

最佳答案

你试图在这段代码中做的不是你想的(我怀疑)例如:
x[::2] 将返回包含 x 的每个 奇数 元素的切片,因为 x 的大小为 20,
切片的大小为 10,但您正试图为其分配一个大小为 1 的不可迭代对象。

要成功使用您拥有的代码,您需要执行以下操作:

x = [True]*20
x[::2] = [False]*10

这会将大小为 10 的可迭代对象分配给大小为 10 的切片。

为什么要在黑暗中使用元素数量?使用

len(x[::2])  

这将等于 10,然后使用

x[::2] = [False]*len(x[::2])

你也可以这样做:

x = [True if (index & 0x1 == 0) else False for index, element in enumerate(x)]

编辑:由于 OP 编辑​​

documentation on cycle 表示它 Repeats indefinitely. 这意味着它将不断地“循环”通过给定的迭代器。

Repeat 有类似的实现,但是 documentation声明它
无限期运行,除非指定了 times 参数。
这在问题代码中还没有完成。因此两者都会导致无限循环。

关于 itertools 更快的评论。是的,itertools 通常比其他实现更快,因为它们经过优化以尽可能快地达到创建者的速度。

但是,如果您不想重新创建列表,您可以使用生成器表达式,如下所示:

x = (True if (index & 0x1 == 0) else False for index, element in enumerate(x))

它不会将所有元素都存储在内存中,而是在需要时生成它们,但是,生成器函数可以用完。

例如:

x = [True]*20
print(x)
y = (True if (index & 0x1 == 0) else False for index, element in enumerate(x))
print ([a for a in y])
print ([a for a in y])

会打印x然后是生成器y中的元素,然后是一个空列表,因为生成器已经用完了。

关于python - itertools 和跨步列表赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8336543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com