为什么这不起作用?
# 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
答案 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)