如何在Python中反转列表的一部分(切片)?
为什么这样不行如何在Python中反转列表的一部分(切片)?,python,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 a[2:4]创建所选子列表的副本,该副本由a[2:4].reverse()反转。这不会更
# 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
a[2:4]
创建所选子列表的副本,该副本由a[2:4].reverse()反转。这不会更改原始列表。切片Python列表总是创建副本——您可以使用
b = a[:]
复制整个列表。a[2:4]是使用列表a中的2,3,4项构建的列表a的副本。前两个选项起作用,因为您正在将更改指定给原始列表中的那些点。最后一个不起作用,因为您没有影响原始列表。另一个您可以考虑的方式是使用反向切片:
a[2:4] = a[3:1:-1]
只需使用切片并将其反转即可
a[2:4] = a[2:4][::-1]
这里有一个奇怪的例子和更奇怪的解决方案,使用切片和一些
列出基本原理
问题:将列表分成两部分反转
I/p:[1,2,3,4,5,6]
O/p:[3,2,1,6,5,4]
Soln:
[item for i in range(0,len(l),len(l)/2) for item in l[i:i+len(l)/2][::-1]]
' '.join(map(lambda x:x[::-1], s.split()))
问题:颠倒某人姓名的字母
例如哈里·波特
O/p:yrraH追溯
Soln:
[item for i in range(0,len(l),len(l)/2) for item in l[i:i+len(l)/2][::-1]]
' '.join(map(lambda x:x[::-1], s.split()))
我认为有必要进一步阐述原因
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]
在作业左侧出现时的不同之处。一种完全到位的方法是使用好的旧循环:
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)
@İsmail:我看不出易变性和切片创建拷贝之间有什么联系。切片NumPy数组不会创建副本,它们也是可变的。这些都是独立的设计决策。@奥斯梅尔:我似乎不明白你在追求什么。如果Python列表是不可变的,您就无法判断是否创建了副本,因为您无论如何都无法更改它。Nit:“切片Python列表总是创建副本”-除非它们被分配到,如OP示例中的a[2:4]=reversed(a[2:4])
。人们可能会认为x=reversed(x)
和x.reverse()
都修改了x
,但它们在Python中是根本不同的操作,并且当x
不是一个变量时,它们的结果会有所不同,如图所示,无法使用这种精确的方法来反转包含第一个元素的切片。@实际上,昆托皮亚:只需省略第一个索引:断言[3::-1]==[4,3,2,1]
@VMAtm好点。我现在知道了,但那时我不知道。它确实指出了语言中某种正交性的缺失,不是吗?对我来说,这只是一种惯例,如果在spolyce中省略第二(或第一)个索引,你只需说-从开始到结束,不需要计算这些索引。事实上,这是一个伟大的点,arr[i:j]。reverse()
返回类型是None
。