将所有非'0'推到前面

时间:2015-10-15 23:34:34

标签: python-2.7 iteration

我正在使用以下(丑陋)片段来迭代带有字符串的二维列表。它检查其中一个值是否为'0',以及它是否不是最后一个元素。如果不是,它将使用下一个元素的值切换当前元素的值('0')。

我打算通过此功能实现的目的是将所有非'0'值推到后面。它显然没有按预期工作(这是一个开始),但我无法找到一种方法来完成这项工作而不会把它变成一团糟。

这个谜题缺少什么?递归会有帮助吗?

['0', '2', '0', '4']

应该变成

['2', '4', '0', '0']

['0', '3', '1', '0', '2']

['3', '1', '2', '0', '0']  

当前摘录:

for idx, x in enumerate(self.list_x):
     for idy, i in enumerate(x):
        if i == '0':
            try:
                if x[idy+1]:
                    pass
            except IndexError:
                pass
            else:
                temp = i
                self.list_x[idx][idy] = x[idy+1]
                self.list_x[idx][idy+1] = temp

2 个答案:

答案 0 :(得分:4)

In [63]: A = ['0', '2', '0', '4']

In [64]: B = ['0', '3', '1', '0', '2']

In [65]: [i for i in A if i!='0'] + [i for i in A if i=='0']
Out[65]: ['2', '4', '0', '0']

In [66]: [i for i in B if i!='0'] + [i for i in B if i=='0']
Out[66]: ['3', '1', '2', '0', '0']

答案 1 :(得分:0)

In [79]: L = ['0', '2', '0', '4']

In [80]: inds = [i for i,e in enumerate(L) if e!='0']

In [81]: answer = list(operator.itemgetter(*inds)(L)) + ['0']*(len(L)-len(inds))

In [82]: answer
Out[82]: ['2', '4', '0', '0']