将所有非'0'推到前面
Push all non-'0' to front
我正在使用以下(丑陋的)代码段来迭代带有字符串的二维列表。它检查其中一个值是否为 '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
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']
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']
我正在使用以下(丑陋的)代码段来迭代带有字符串的二维列表。它检查其中一个值是否为 '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
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']
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']