繁体   English   中英

python在函数中修改列表切片

[英]python Modifying slice of list in function

考虑以下代码:

def func1(a):
    a[:] = [x**2 for x in a]

a = range(10)
print a  #prints [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
func1(a[:5])
print a  #also prints [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

我希望发送列表a并在函数内对其进行更改。 我的预期输出是

[0, 1, 4, 9, 16, 5, 6, 7, 8, 9]

惯用的方法是哪种?

谢谢!

如果对列表进行切片,则只能修改一个副本,因此您要执行的操作无法按照您想要的形式进行。

但是您可以将一个可选的slice对象传递给func1 ,如果不是None ,可以使用它来执行slice分配(否则使用[:]

我将执行以下操作(使用lambda避免公式的复制/粘贴和生成器表达式,以避免创建无用的临时列表:

def func1(a,the_slice=None):
    e = lambda y : (x**2 for x in y)
    if the_slice:
        a[the_slice] = e(a[the_slice])
    else:
        a[:] = e(a)

测试:

a = list(range(10))
func1(a)
print(a)
a = list(range(10))
func1(a,slice(5))   # stop at 5
print(a)
a = list(range(10))
func1(a,slice(5,len(a),2))  # start at 5 / stop at the end, stride/step 2
print(a)

结果:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 25, 6, 49, 8, 81]
  • 在第一种情况下,列表的总数已更改
  • 在第二种情况下,它仅更改了上半部分。
  • 在第三种情况下,它更改了下半部分,但是2中有1个值(步幅= 2)

这将起作用:

a = range(10)

a[:5] = [c**2 for c in a[:5]]

a[:5]创建一个新列表。 因此,该修改func1适用于它不是反映了a 您可以将切片添加到函数中:

def func1(a, start=None, stop=None, step=None):
    start = start if start is not None else 0
    stop = stop if stop is not None else len(a)
    step = step if step is not None else 1
    a[start:stop:step] = [x**2 for x in a[start:stop:step]]

func1(a, stop=5)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM