在 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)
这是我的列表:
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)