更新列表切片的更优雅方式

时间:2011-04-28 14:42:07

标签: list iteration python

给定一个列表,我想将一组操作应用于列表的子集(切片),并将每个转换的结果存储在原始列表中。

我的背景是在Ada,这导致我犯了以下错误:

Number_List = [0,1,2,3,4,5,6,7,8,9]
for Index, Number in enumerate(Number_List[1:]):
  Number_List[Index] = Number + 1

给出一个新的Number_List:2,3,4,5,6,7,8,9,10,9并告诉我一个数组的片被重新索引为0.

我已经转移到以下,这很麻烦但功能齐全。

Number_List = [0,1,2,3,4,5,6,7,8,9]
for Index in range(1,len(Number_List))
  Number_List[Index] = Number_List[Index]+1

我正在寻找一种更优雅的方式来做到这一点。

3 个答案:

答案 0 :(得分:8)

enumerate需要start参数:

Number_List = [0,1,2,3,4,5,6,7,8,9]
for Index, Number in enumerate(Number_List[1:], start=1):
  Number_List[Index] = Number + 1

你也可以写

Number_List[1:] = [x+1 for x in Number_List[1:]]

答案 1 :(得分:1)

from itertools import islice
number_list[start:stop] = (x + 1 for x in islice(number_list, start, stop))

或者,使用number_list[start:stop]代替islice,但这会不必要地创建另一个切片。这可以通过切片分配以任意方式更新列表,并避免显式循环。

答案 2 :(得分:1)

您可以使用列表推导和切片效果很好:

vals = range(10) #gives your example numbers
vals[1:] = [v + 1 for v in vals[1:]]