1

假设我有以下列表:

my_list = [2, 3, 4, 1, 44, 222, 43, 22]

如何在不使用 for 循环的情况下为子列表中的所有元素分配一个常量值?就像是:

my_list[0:5:1] = 1 # Assign 1 to first 5 elements. This code is wrong since list requires an iterator 

具体来说,我想为所有元素分配一个常量值,从索引开始,i直到end列表的

my_list[i:end] = 1 # What I would like to do. The code itself is wrong  

关于如何在 python 中以最干净的方式做到这一点的任何建议?

4

6 回答 6

6

有时 2 线比 1 线更好。

for i in range(0,5):
    my_list[i] = 0

如果你真的想让一些东西变得模糊:

这是一个在不改变原始数组的情况下完成这项工作的单线器。

new_list = [0 if i in range(0,5) else x for x, i in zip(my_list, xrange(len(my_list)))]

您更愿意在未知代码中遇到哪个?或 6 个月后您自己的代码。

于 2012-07-05T19:50:24.313 回答
4

以下应该有效:

my_list[i:end] = [1]*(end-i)

例子:

>>> def test(my_list, i, end):
...     my_list[i:end] = [1]*(end-i)
...     return my_list
>>> test(range(10), 0, 5)
[1, 1, 1, 1, 1, 5, 6, 7, 8, 9]
>>> test(range(10), 5, 10)
[0, 1, 2, 3, 4, 1, 1, 1, 1, 1]
>>> test(range(10), 3, 8)
[0, 1, 2, 1, 1, 1, 1, 1, 8, 9]
于 2012-07-05T19:53:20.527 回答
2

一种可能性是stuff [0:5] = [1] * 5。但是,您应该小心,因为如果替换元素的数量错误,这将改变列表的大小。如果这样做stuff [0:5] = [1] * 6,您将增加列表的大小(即,在原来有五个原始值的地方放置六个 1)。

于 2012-07-05T19:52:19.897 回答
1

要转到列表的末尾,只需省略切片的末尾。然后,您可以重复一个列表以分配给它:

my_list[i:] = [1] * (len(my_list) - i)
于 2012-07-05T19:55:22.760 回答
1

这个怎么样?

from itertools import repeat

my_list[start:end] = repeat( 1, end - start )
于 2012-07-05T20:40:54.923 回答
0

这会起作用吗:

my_list = my_list[:i] + [1 for x in xrange(len(my_list) - i)]
于 2012-07-05T19:49:39.533 回答