【问题标题】:More elegant way for updating a slice of a list更新列表片段的更优雅的方式
【发布时间】:2011-04-28 14:42:06
【问题描述】:

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

我的背景是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

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

【问题讨论】:

  • 感谢标签更新。我喜欢有一个“pythonic”标签。

标签: list iteration python


【解决方案1】:

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:]]

【讨论】:

  • 我更喜欢第二个例子,但对于更复杂的操作,我可能会觉得它变得令人困惑。
【解决方案2】:
from itertools import islice
number_list[start:stop] = (x + 1 for x in islice(number_list, start, stop))

或者,使用number_list[start:stop] 而不是islice,但这会不必要地创建另一个切片。由于切片分配,这会就地更新列表并避免显式循环。

【讨论】:

    【解决方案3】:

    您可以使用列表推导式和切片来获得很好的效果:

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

    【讨论】:

      猜你喜欢
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2017-11-12
      • 1970-01-01
      相关资源
      最近更新 更多