我应该创建一个函数,该输入是一个列表和两个数字,该函数反转子列表,其位置由两个数字表示。 例如,这就是它应该做的事情:
>>> lst = [1, 2, 3, 4, 5]
>>> reverse_sublist (lst,0,4)
>>> lst [4, 3, 2, 1, 5]
我创建了一个功能,但它确实有效,但我不确定它是否已经到位。 这是我的代码:
def reverse_sublist(lst,start,end):
sublist=lst[start:end]
sublist.reverse()
lst[start:end]=sublist
print(lst)
答案 0 :(得分:19)
def reverse_sublist(lst,start,end):
lst[start:end] = lst[start:end][::-1]
return lst
答案 1 :(得分:1)
......我不确定它是否到位。
...
lst[start:end]=sublist
是的,它已经到位了。 lst
永远不会反弹,只有它的对象发生变异。
答案 2 :(得分:1)
部分反向,没有临时列表(如果使用Python 2,则将range
替换为xrange
):
def partial_reverse(list_, from_, to):
for i in range(0, int((to - from_)/2)):
(list_[from_+i], list_[to-i]) = (list_[to-i], list_[from_+i])
list_ = [1, 2, 3, 4, 5, 6, 7, 8]
partial_reverse(list_, 3, 7)
print(list_)
答案 3 :(得分:1)
尝试一些crazy slicing
,请参阅Explain Python's slice notation和http://docs.python.org/2.3/whatsnew/section-slices.html
x = [1,2,3,4,5,6,7,8]
def sublist_reverse(start_rev, end_rev, lst):
return lst[:end_rev-1:start_rev-1]+lst[:[end_rev]
print sublist_reverse(0,4,x)
[OUT]:
[8, 7, 6, 5, 4, 3, 2, 1]
答案 4 :(得分:1)
以部分或完整方式反转列表的最简单方法。
listVar = ['a','b','c','d']
def listReverse(list,start,end):
while(start<end):
temp = list[start]
list[start] = list[end] #Swaping
list[end]=temp
start+=1
end-=1
print(list)
listReverse(listVar,1,3)
输出: - ['a','d','c','b']
答案 5 :(得分:1)
不知道您是否有与我类似的问题,但我需要在适当的位置翻转列表。
我唯一缺少的是 [:]
exStr = "String"
def change(var):
var[:] = var[::-1] # This line here
print(exStr) #"String"
change(exStr)
print(exStr) #"gnirtS"
答案 6 :(得分:0)
只需使用切片:
>>> lst = [1, 2, 3, 4, 5]
>>> lst[0:len(lst[3::-1])]=lst[3::-1]
>>> lst
[4, 3, 2, 1, 5]
或者,也许更容易理解:
>>> lst = [1, 2, 3, 4, 5]
>>> sl=lst[3::-1]
>>> lst[0:len(sl)]=sl
>>> lst
[4, 3, 2, 1, 5]
答案 7 :(得分:0)
lst[::-1]
是在Python中反转列表的惯用方法,下面显示了它是如何以及它是就地的:
>>> lst = [1, 2, 3, 4, 5]
>>> id(lst)
12229328
>>> lst[:] = lst[::-1]
>>> lst
[5, 4, 3, 2, 1]
>>> id(lst)
12229328
答案 8 :(得分:0)
我有两种方法进行就地反转,简单的方法是在中途循环遍历列表,使用相应的 mirror-elements 交换元素。通过 mirror-element 我的意思是(第一个,最后一个),(第二个,第二个,最后一个),(第三个,第三个 - 最后一个)等等。
def reverse_list(A):
for i in range(len(A) // 2): # half-way
A[i], A[len(A) - i - 1] = A[len(A) - i - 1], A[i] #swap
return A
另一种方式与上面类似但是使用递归而不是&#34;循环&#34;:
def reverse_list(A):
def rev(A, start, stop):
A[start], A[stop] = A[stop], A[start] # swap
if stop - start > 1: # until halfway
rev(A, start + 1, stop - 1)
return A
return rev(A, 0, len(A) - 1)
答案 9 :(得分:0)
我进行了一个小实验,看来对列表片的任何分配都会导致内存分配:
import resource
resource.setrlimit(resource.RLIMIT_AS, (64 * 1024, 64 * 1024))
try:
# Python 2
zrange = xrange
arr_size = 3 * 1024
except NameError:
# Python 3
zrange = range
arr_size = 4 * 1024
arr = list(zrange(arr_size))
# We could allocate additional 100 integers, so there should be enough free memory
# to allocate a couple of variables for indexes in the statement below
# additional_memory = list(zrange(100))
# MemoryError is raised here
arr[:] = zrange(arr_size)
因此,您必须使用for循环在适当的位置反转子列表。
PS:如果要重复此测试,则应确保 setrlimit RLIMIT_AS 在您的平台上可以正常工作。同样, arr_size 可能因不同的python实现而有所不同。
答案 10 :(得分:0)
就地和常量存储有两种方法:
Int
答案 11 :(得分:0)
最简单的方法可能是使用切片赋值和reversed()
:
lst[start:end] = reversed(lst[start:end])
您也可以同时切片和反转,但这通常需要使用负索引或特殊处理 start = 0
时的情况,即:
lst[start:end] = lst[end-len(lst)-1:start-len(lst)-1:-1]
或
lst[start:end] = lst[end-1::-1] if start == 0 else lst[end-1:start-1:-1]
OTOH,单独使用切片比 reversed()
解决方案更快。
答案 12 :(得分:-1)
lst = [1,2,3,4,5,6,7,8]
假设你必须将第二个位置反转到第四个位置。
lst[2:5] = lst[2:5][::-1]
输出:
[1,2,5,4,3,6,7,8]