Python3 - 排序列表

时间:2015-06-14 13:41:35

标签: python list python-3.x

我不明白为什么1和5打印三次。 (我知道我可以使用list.sort()方法。)

lst = [4,5,5,1,6,1]
copy = lst.copy()
sort = []
for i in range(len(lst)):
    min_ = min(copy)
    for k in copy:
        if k == min_:
            sort.append(min_)
    copy.remove(min_)
print(sort)

1 个答案:

答案 0 :(得分:3)

list.remove()删除了值的第一个,而不是所有这些值。因此,您首先将1值添加到sort,删除两个1值中的一个,然后将剩余的1值添加到{{1}再次:

sort

您可以使用列表推导来删除所有值,实质上是通过过滤创建一个排除要删除的值的新副本:

>>> lst = [4,5,5,1,6,1]
>>> copy = lst.copy()
>>> sort = []
>>> min_ = min(copy)
>>> min_
1
>>> for k in copy:
...     if k == min_:
...         sort.append(min_)
... 
>>> sort
[1, 1]
>>> copy.remove(min_)
>>> copy
[4, 5, 5, 6, 1]
>>> min_ = min(copy)
>>> min_
1
>>> for k in copy:
...     if k == min_:
...         sort.append(min_)
... 
>>> sort
[1, 1, 1]

当然,效率不高。

请注意,您遇到的下一个问题是,在完成所有copy = [v for v in copy if v != min_] 次迭代之前,您已清空copy。您可以使用range(len(lst))循环替换该循环。

或者,您只需将while copy:值的第一个匹配添加到min_

sort

for i in range(len(lst)): min_ = min(copy) for k in copy: if k == min_: sort.append(min_) break copy.remove(min_) 提前结束break循环。当然,您甚至不必循环查找最小值,即for调用已经执行的内容,因此您可以完全删除它:

min()