如何在Python中反转列表的一部分(切片)?

时间:2011-01-10 13:33:39

标签: python

为什么这不起作用?

# to reverse a part of the string in place 
a = [1,2,3,4,5]
a[2:4] = reversed(a[2:4])  # This works!
a[2:4] = [0,0]             # This works too.
a[2:4].reverse()           # But this doesn't work

7 个答案:

答案 0 :(得分:16)

a[2:4]创建所选子列表的副本,此副本由a[2:4].reverse()反转。这不会更改原始列表。切片Python列表总是会创建副本 - 您可以使用

b = a[:]

复制整个清单。

答案 1 :(得分:11)

只需使用切片并将其反转。

a[2:4] = a[2:4][::-1]

答案 2 :(得分:6)

您可能考虑的另一种方法是使用反转切片:

a[2:4] = a[3:1:-1]

答案 3 :(得分:1)

a [2:4]是使用列表a中的2,3,4项构建的列表a的副本。前两个工作是因为您将更改分配到原始列表中的那些位置。最后一个不起作用,因为您没有影响原始列表。

答案 4 :(得分:1)

  

这是一个奇怪的例子和使用切片和一点点的更奇怪的解决方案   列出基本面。

问题: 以两部分的方式撤销列表。

I / P: [1,2,3,4,5,6]

O / P: [3,2,1,6,5,4]

<强>溶液:

[item for i in range(0,len(l),len(l)/2) for item in l[i:i+len(l)/2][::-1]]

问题 :撤消某人名字的字母。

E.g Harry Porter

O / p:yrraH retroP

<强>溶液:

' '.join(map(lambda x:x[::-1], s.split()))

答案 5 :(得分:0)

我认为值得进一步阐述其原因

a[2:4].reverse()

似乎不起作用。

除了a[2:4]在内存中创建副本之外,还应注意

list.reverse()

在适当的位置反转列表,其返回类型为None。如果你这样做

print(a[2:4].reverse())

None被打印。显然,如果您强行这样做,

a[2:4] = a[2:4].reverse()

Python将引发TypeError。但是,内存中确实存在a[2:4]的副本,该副本已被撤消。只是您无权访问它。

另一方面,a[2:4] = reversed(a[2:4])起作用是因为reversed()返回了反向迭代器。

有关a[2:4]出现在作业左侧的区别,请参见接受的答案的注释。

答案 6 :(得分:0)

纯粹在原地执行此操作的一种方法是使用良好的旧循环:

def reverse(seq, start, stop):
    size = stop + start
    for i in range(start, (size + 1) // 2 ):
        j = size - i
        seq[i], seq[j] = seq[j], seq[i]


l = list(range(10))
print(l)
reverse(l, 2, 5)
print(l)