如何反转列表中的子列表?

时间:2014-03-07 17:53:28

标签: python list function sublist

我应该创建一个函数,该输入是一个列表和两个数字,该函数反转子列表,其位置由两个数字表示。 例如,这就是它应该做的事情:

>>> 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)

13 个答案:

答案 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 notationhttp://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]