如何更改列表中数字的位置,python
我有一个列表,例如[1,3,0,2,6,0,7] 如果有“0”,我必须把它放在列表的末尾,而不改变其他数字的位置。 应返回-[1,3,2,6,7,0,0]如何更改列表中数字的位置,python,python,list,numbers,Python,List,Numbers,我有一个列表,例如[1,3,0,2,6,0,7] 如果有“0”,我必须把它放在列表的末尾,而不改变其他数字的位置。 应返回-[1,3,2,6,7,0,0] 提前感谢!:) 肯定是一种更简单的方法,但我想到了以下几点: l = [1, 3, 0, 2, 6, 0, 7] le = len(l) l = [x for x in l if x !=0] for i in range(0,le-len(l)): l.append(0) 输出: [1, 3, 2, 6, 7, 0, 0] 只需
提前感谢!:) 肯定是一种更简单的方法,但我想到了以下几点:
l = [1, 3, 0, 2, 6, 0, 7]
le = len(l)
l = [x for x in l if x !=0]
for i in range(0,le-len(l)):
l.append(0)
输出:
[1, 3, 2, 6, 7, 0, 0]
只需按零排序:
>>> a = [1, 3, 0, 2, 6, 0, 7]
>>> a.sort(key=bool, reverse=True)
>>> a
[1, 3, 2, 6, 7, 0, 0]
这是另一种不同于目前答案的方法。无论是0还是需要相同操作的另一个数字(只要用
过滤器
功能中所需的数字替换0),这都会起作用
输出:
[1, 3, 2, 6, 7, 0, 0]
这是一个基本的编程练习,让我们用最基本的Python构造来实现它。一个简单的算法是跟踪一个索引,在该索引中检测到第一个零,并将非零数字与该位置交换,然后向前移动。这将在整个列表中携带零,直到所有的零在最后聚集在一起
numbers = [1, 3, 0, 2, 6, 0, 7]
firstZero = -1 # track position of first zero
for index,number in enumerate(numbers): # go through numbers in list
if firstZero < 0:
if number == 0: # do nothing until a zero is found
firstZero = index # start tracking first zero position
elif number != 0:
numbers[firstZero] = number # swap non-zero numbers
numbers[index] = 0 # with zero position
firstZero += 1 # and advance first zero position
print(numbers)
# [1, 3, 2, 6, 7, 0, 0]
key参数使用函数获取要排序的键(与数字本身相反)。这里的函数是notn
,当应用于整数时,如果它为零,则返回True;如果不是,则返回False。这将通过以下方式将排序键与数字匹配:
False, False, True, False, False, True, False
[1, 3, 0, 2, 6, 0, 7]
对布尔值进行排序时,将假值置于真值之前,Python排序的稳定性将保持相同键值项的相对顺序:
False, False, False, False, False True, True
[1, 3, 2, 6, 7, 0, 0]
计算出的键值仅在排序过程中存在,结果只是相应排序的数字列表
虽然使用sort函数是一个很好的技巧,但在复杂度方面,它将在O(n logn)时间内执行。更专业化的基本算法能够在O(n)时间内执行的数据单次传递中完成相同的工作
在O(n)时间内将列表末尾的零分组的另一种方法是,通过将非零项列表与适当长度的零列表组合,构建一个新列表:
nonZero = [*filter(bool,numbers)]
numbers = nonZero + [0]*(len(numbers)-len(nonZero))
然后使用列表理解和从过滤器迭代器中解包结果来构建
nonZero
list。第二部分是重复一个列表,其中0表示达到原始长度所需的次数。如果您在自己解决此问题时遇到了具体问题,可以在此处询问。到目前为止,您做了哪些尝试?看,欢迎来到这个网站!我建议您尝试让我们知道您迄今为止尝试了什么,以及为什么它不起作用。
numbers.sort(numbers,key=lambda n:not n)
False, False, True, False, False, True, False
[1, 3, 0, 2, 6, 0, 7]
False, False, False, False, False True, True
[1, 3, 2, 6, 7, 0, 0]
nonZero = [*filter(bool,numbers)]
numbers = nonZero + [0]*(len(numbers)-len(nonZero))