说我有以下列表:
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中以最干净的方式进行操作的任何建议吗?
答案 0 :(得分: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个月后你自己的代码。
答案 1 :(得分: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]
答案 2 :(得分:2)
一种可能性是stuff [0:5] = [1] * 5
。但是,您应该小心,因为如果您更换错误的替换元素的数量,这将更改列表的大小。如果你stuff [0:5] = [1] * 6
,你将增加列表的大小(即,将六个1放在曾经有五个原始值的位置)。
答案 3 :(得分:1)
要转到列表的末尾,只需省略切片的结尾。然后,您可以重复列表以分配给它:
my_list[i:] = [1] * (len(my_list) - i)
答案 4 :(得分:1)
这个怎么样?
from itertools import repeat
my_list[start:end] = repeat( 1, end - start )
答案 5 :(得分:0)
这会有效吗?
my_list = my_list[:i] + [1 for x in xrange(len(my_list) - i)]