我必须创建一个代码(函数),在不使用临时列表的情况下移动列表中的元素,并且函数必须不返回任何内容,我已经尝试了以下但是它不起作用请帮助
def move_zeros_v2(lst):
left = []
right = []
left_a = left.append
right_a = right.append
for x in lst:
if x:
left_a(x)
else:
right_a(x)
left.extend(right)
i = 0
while i < len(left):
lst[i] = left[i]
i = i + 1
x = [1, 0, 3, 0, 0, 5, 7]
z=move_zeros_v2(x)
print(x, z)
答案 0 :(得分:4)
这是一种方法:
def move_zeros(lst):
n = len(lst)
lst[:] = filter(None, lst)
lst.extend([0] * (n - len(lst)))
答案 1 :(得分:0)
这里的大“问题”是“没有临时名单”。这意味着在改变真实列表的同时迭代列表副本的常用方法......
for idx, el in enumerate(lst[:]):
...违反了作业规则。相反,你将不得不用索引等做一些jiggery pokery。
for idx in range(len(lst)):
el = lst[idx]
while el == 0:
# push the zero to the end of the list
lst.append(lst.pop(idx))
el = lst[idx] # check if the next one is a zero as well!
这通常是一个坏主意,并且在Python中肯定有代码味道。如果这是真实代码,你不应该对使用临时列表感到不好,但我认为这是一个家庭作业。
答案 2 :(得分:0)
使用常规列表方法非常容易,但这并不是完成任务的最佳或最有效的方法。
取一些带有零的整数的常规列表:
test_list = [1, 2, 4, 0, 3, 5, 0, 9, 0, 3, 4, 7]
计算出有多少个零。你最后会坚持这些:
zeroes_to_append = test_list._____(0)
您可以使用简单的循环删除原始零。当你用完零时,这个方法会导致(catchable)ValueError
:
>>> while True:
... try:
... test_list.______(0)
... except ValueError:
... break
然后你将你删除的零的数量放回到右端:
for i in range(zeroes_to_append):
test_list.append(0)
唯一剩下的就是通过查找我使用的实际方法完成你的作业,以便填补空白&#34;在这个答案。使用this page in the Python docs作为参考帮助!
答案 3 :(得分:0)
这不是一个非常有效的解决方案,但我认为,这是您需要的解决方案类型。
x = [1, 0, 3, 0, 0, 5, 7]
for _ in range(len(x)-1):
for index in range(len(x)-1):
if x[index]==0:
x[index+1],x[index]=x[index],x[index+1]
print x
输出:
[1, 3, 5, 7, 0, 0, 0]
答案 4 :(得分:-4)
使用相同列表的解决方案更新了答案;
lst = filter(lambda x: x!=0, lst) + lst[:]
#which returns [1, -1, 5, 7, 0, 0, 0] for lst = [1, 0,-1, 0, 0, 5, 7]
您可以将listcomprehension与sorted()和reversed()
一起使用x = [1, 0, 3, 0, 0, 5, 7]
sorted_x = [i for i in reversed(sorted(x))]
# will return [7, 5, 3, 1, 0, 0, 0]