我有一个包含以下内容的列表:
lst = [[5, 2], [4, 7], [3, 5]]
我想重新排列它们:
[[3,5],[4,7],[5,2]]
我遇到的问题是安排它们,使包含最小第一个元素的列表成为第一个。在这种情况下,表格中的第三个列表[3,5]具有其余的最小的第一个元素,3< 4也是< 7
我想用一个简单的for循环实现这一点,这个循环涉及交换所以我试图:
for i in range(1,len(lst)):
smallest = 0
if lst[smallest][0] > lst[i][0]:
lst[smallest],lst[i] = lst[i],lst[smallest]
但我得到了输出:
[[3,5],[5,2],[4,7]]
答案 0 :(得分:1)
sorted
已按字典顺序排序,因此简单命令
>>> sorted([[5, 2], [4, 7], [3, 5]])
[[3, 5], [4, 7], [5, 2]]
就是你所需要的一切。
答案 1 :(得分:1)
您的代码存在多个问题。
您只需迭代一次列表。没有排序算法只能通过迭代一次对列表进行排序 - 如果你能做到这一点,你就发明了世界上第一个O(n)排序算法。所以你必须添加另一个循环,循环直到列表正确排序。
while True:
changed = False
for i in range(1,len(lst)):
smallest = 0
if lst[smallest][0] > lst[i][0]:
lst[smallest],lst[i] = lst[i],lst[smallest]
changed = True
if not changed:
break
您只需将更大的元素交换到列表中的第一个位置。如果第二个元素大于第三个元素,则代码永远不能交换它们。而不是硬编码smallest = 0
,你必须在每次迭代时增加smallest
。
for smallest in range(len(lst)):
changed = False
for i in range(1,len(lst)):
if lst[smallest][0] > lst[i][0]:
lst[smallest], lst[i] = lst[i], lst[smallest]
changed = True
if not changed:
break
现在代码正确递增smallest
,但每次都会循环遍历整个列表。因此,如果smallest
是指向列表末尾某处的索引,则代码仍将所有先前元素与smallest
处的元素进行比较。显然,之前的元素已经排序 - 因此保证它们小于smallest
的元素。您的代码最终交换已经排序的数字,因此最终结果不再正确排序。你必须重写内部循环,以便它只在 smallest
之后遍历元素:
for smallest in range(len(lst)):
changed = False
for i in range(smallest+1,len(lst)): # changed 1 to smallest+1 here
if lst[smallest][0] > lst[i][0]:
lst[smallest], lst[i] = lst[i], lst[smallest]
changed = True
if not changed:
break
通过所有这些更改,我们最终得到了正确的结果:
[[3, 5], [4, 7], [5, 2]]