在 Python 内存中不使用额外 space/list/array 的反向列表

Reverse List without using extra space/list/array in memory in Python

这是我的列表:

l = ['m','o','b','i','l','e', ' ','a','l','i',' ']

我需要的输出:

out = ['e','l','i','b','o','m', ' ','i','l','a',' ']

到目前为止,我已经想出了这个解决方案

start = 0
end = len(lst)-1
for i in range(start,end+1):
    if lst[i]==" ":
        break    
    temp = lst[i] # first
    lst[i] = lst[end]
    lst[end] = temp
       
    start +=1
    end -=1

我正在做的是我只用最后一个元素替换 '' 之前的第一个值。但是我将不得不为剩余的值创建另一个 for 循环。谁能提出更好的解决方案?

不允许将值存储在单独的数组中,只能在此数组中替换它,但允许使用临时变量

您可以使用数组魔法以非常简单的方式完成,无需任何导入函数。

l = ['m','o','b','i','l','e', ' ','a','l','i',' ']
        
wordsList = "".join(l).split(" ")
reversedWordsList = [e[::-1] for e in wordsList]
outputArray = list(" ".join(reversedWordsList))

print(outputArray)

这会将数组连接成一个字符串,并在 space 上拆分它以创建一个包含每个单词的数组。然后它手动反转每个单词,然后将单词重新连接成一个字符串,并将字符串拆分为一个字符数组。

我有另一个可能对您有用的答案,它不使用任何地图或列表魔法,也不会创建任何额外的列表。它所做的只是在起始列表中移动值。

l = ['m','o','b','i','l','e', ' ','a','l','i',' ']
start = 0

for a in range(len(l)):
    if l[a] == ' ':
        start = a + 1
        
    if a > start:
        for b in range(a, start, -1):
            if b > 0:
                temp = l[b]
                l[b] = l[b - 1]
                l[b - 1] = temp
                
print(l)

这个答案比我的另一个答案稍微复杂一些。基本上发生的事情是它在数组中移动,将最后一个元素移到前面。例如,第一次迭代将从 ['m'] 开始,什么都不做。第二个将从 ['m', 'o'] 开始,并将 'o' 移到前面,因此它将以 ['o', 'm] 结束。第三次迭代将从 ['o', 'm', 'b'] 开始,将 'b' 移到前面,以 ['b', 'o', 'm'] 结束。每次它看到 space 时,它都会重置“前面”,因此它会翻转单词而不是整个数组。

这是我的解决方案。更易于阅读和理解。

l = ['m','o','b','i','l','e', ' ','a','l','i',' ']

first = 0
end = len(l)-1
mid = 0

for i in range(len(l)):
    if l[i]==" ":
        mid = i
        break
def Rev(l, start, end):
    while start<end:
        l[start],l[end] = l[end], l[start]
        start +=1
        end -=1

Rev(l, first, mid-1)
Rev(l, mid, end)
print(l)