如何将零移动到列表的末尾

时间:2015-11-03 19:24:24

标签: python python-3.x

我必须创建一个代码(函数),在不使用临时列表的情况下移动列表中的元素,并且函数必须不返回任何内容,我已经尝试了以下但是它不起作用请帮助

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)

5 个答案:

答案 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]