Python 我如何解决一个本应只移动0';s移到列表的末尾,但同时移动假值?
我正在编写一个函数来将0移动到列表的末尾,但是当列表中有一个False值时,它会将其转换为0并将其移动到末尾 我尝试了多种不同的if语句,包括:Python 我如何解决一个本应只移动0';s移到列表的末尾,但同时移动假值?,python,sorting,Python,Sorting,我正在编写一个函数来将0移动到列表的末尾,但是当列表中有一个False值时,它会将其转换为0并将其移动到末尾 我尝试了多种不同的if语句,包括: 如果i==0 如果类型(i)!=布尔和i==0 如果str(i)=“0” 在[0,1,None,2,False,1,0]的情况下,我希望函数返回[1,None,2,False,1,0,0],但它返回的是[1,None,2,1,0,0]。这里有两个问题。首先,在Python中,bool是int和False==0的子类,因此要区分0和False必须测试对象
在
[0,1,None,2,False,1,0]
的情况下,我希望函数返回[1,None,2,False,1,0,0]
,但它返回的是[1,None,2,1,0,0]
。这里有两个问题。首先,在Python中,bool
是int
和False==0
的子类,因此要区分0
和False
必须测试对象的类型。此外,在迭代列表时修改列表肯定会导致“关闭”错误
下面是一个简单而简单的实现:
def move_zeros(seq):
head, tail = [], []
for v in seq:
if isinstance(v, int) and not isinstance(v, bool) and v == 0:
tail.append(v)
else:
head.append(v)
return head + tail
这里有几个陷阱。您已经了解的一点是,没有一种简单的方法可以区分
0
和False
。然而,还有另外两点:
array.remove()
的作用与您认为的不同。它可能与迭代循环中的元素处于同一位置,也可能不处于同一位置。负责将False
转换为0
def is_integer_zero(x):
# The cleanest way I found, but you could argue for other options
return x == 0 and not isinstance(x, bool)
def move_zeros(array):
left_part = []
right_part = []
for i in array:
if is_integer_zero(i):
right_part.append(i)
else:
left_part.append(i)
return left_part + right_part
l = [0, 1, None, 2, False, 1, 0]
print(move_zeros(l)) # [1, None, 2, False, 1, 0, 0]
right\u部分
完全由零组成,因此您可以简化代码/大大提高性能,但该版本的优点是您可以使用其他条件来选择右移的内容。谢谢,我还添加了or isinstance(v,float)对于可能的0.0值,我可以提供帮助-然后可以自由地对我的答案进行投票。你可能还想投票,接受勒波雷洛的答案,这个答案比我的答案更准确。我是个新手,一个小时前我就报名了,所以我对你和莱波雷洛的答案都投了赞成票,但我想当我还不到15分的时候,答案就不会出现了reputation@hubvoy感谢我们两人8-),请不要忘记接受leporello的答案,这个答案值得在这里标记为一个正确答案(记住,建立一个技术知识库,所以接受最好的解决方案对未来读者来说是很重要的)。好吧,接受这个答案只是在投票计数器下面勾选它。如果你想使它更通用,请考虑传递谓词函数(这里是代码> iSythigGrEZ0)作为一个回调。显然,对于OP的问题,完全超出了上限,但因为您提到了“使用其他条件”…;-)
def is_integer_zero(x):
# The cleanest way I found, but you could argue for other options
return x == 0 and not isinstance(x, bool)
def move_zeros(array):
left_part = []
right_part = []
for i in array:
if is_integer_zero(i):
right_part.append(i)
else:
left_part.append(i)
return left_part + right_part
l = [0, 1, None, 2, False, 1, 0]
print(move_zeros(l)) # [1, None, 2, False, 1, 0, 0]