Python:如何连续删除列表的最小值并将其添加到另一个列表?

时间:2019-03-04 01:54:06

标签: python python-3.x

我目前是Python的新手,我正在尝试高效地学习它。我为自己创建的项目需要我获取列表的最小值,然后将其添加到另一个列表中,然后最终删除该最小值并重做该过程,直到原始列表中没有更多的值为止。

例如,如果我有

list = [0, 3, 2, 1, 4, 2, 4, 5, 5]

我要检索具有以下值的列表:

list2 = [0, 1, 2, 2, 3, 4, 4, 5, 5] #(in this specific order)
list = [] # empty because values have been deleted. 

这是我已经拥有的代码:

count = 0
counter = len(group0)
while counter > 1:
    while count < len(group0):
         if min(group0) == group0[count]:
            finalgroup0.append(group0[count]) #finalgroup0 is an empty list at the start.
            group0.remove(group0[count]) #group0 has all of the values. 
            count += 1
        else:
            count += 1
    counter -= 1

注意:删除列表中值的唯一原因是可以再次提取整个列表中的最小值。如果没有必要,请给我启发。同样,此代码在一定程度上起作用了,但是并没有遍及整个列表。这就是为什么我在外部添加了while循环,以便一旦它到达一个就可以完成,但是那也不起作用。我相信这是因为它正在检查“ count”的所有值并检查它是否是最小值,这就是为什么计数器值需要更高的原因。但是,如果我增加计数器值,则会出现“列表索引超出范围”错误。

我知道我的代码不是最有效的,但是我一直在这样做,并且尝试使用for循环和其他方法,但是没有一个起作用。如果有人可以帮助我,我将不胜感激。

谢谢。

4 个答案:

答案 0 :(得分:2)

list = [0, 3, 2, 1, 4, 2, 4, 5, 5]
list.sort()
list2, list = list, []

答案 1 :(得分:1)

使用sort()方法

list.sort()
print(list)

它将为您节省一个额外的变量(list2)

答案 2 :(得分:0)

有很多方法可以做到,尤其是在使用python时。

如果您的列表很小,通常我们真的不太在乎性能。可以使用内置的min和delete函数,如果您只需要一个正确的结果(如其他人所提到的那样),则可以对其进行排序并复制到另一个列表中。

如果列表很大,则不建议使用上述两种方法,因为缓存不足问题使它们甚至比预期的要慢。您需要一个堆/优先级队列。

c = [3, 2, 1, 4, 2, 4, 5, 5]

h = []
while c:
    heapq.heappush(h, c.pop())

result = []
while h:
    result.append(heapq.heappop(h))

还有一件事情,永远不要使用list来命名变量,它会覆盖内置列表函数。

答案 3 :(得分:-1)

您可以使用while循环从group0获取最小项并将其附加到finalgroup0,然后从group0删除该项,直到group0变为空:

from operator import itemgetter
group0 = [0, 3, 2, 1, 4, 2, 4, 5, 5]
finalgroup0 = []
while group0:
    i, n = min(enumerate(group0), key=itemgetter(1))
    finalgroup0.append(n)
    del group0[i]
    print('finalgroup0:', finalgroup0)
    print('group0:', group0)

这将输出:

finalgroup0: [0]
group0: [3, 2, 1, 4, 2, 4, 5, 5]
finalgroup0: [0, 1]
group0: [3, 2, 4, 2, 4, 5, 5]
finalgroup0: [0, 1, 2]
group0: [3, 4, 2, 4, 5, 5]
finalgroup0: [0, 1, 2, 2]
group0: [3, 4, 4, 5, 5]
finalgroup0: [0, 1, 2, 2, 3]
group0: [4, 4, 5, 5]
finalgroup0: [0, 1, 2, 2, 3, 4]
group0: [4, 5, 5]
finalgroup0: [0, 1, 2, 2, 3, 4, 4]
group0: [5, 5]
finalgroup0: [0, 1, 2, 2, 3, 4, 4, 5]
group0: [5]
finalgroup0: [0, 1, 2, 2, 3, 4, 4, 5, 5]
group0: []