迭代python中的子列表

时间:2012-07-05 19:47:09

标签: python list iterator

说我有以下列表:

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中以最干净的方式进行操作的任何建议吗?

6 个答案:

答案 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)]