Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中反转列表的一部分(切片)?_Python - Fatal编程技术网

如何在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