基于第一个元素对列表中的列表进行分组

时间:2018-03-30 10:26:05

标签: python

我有一个包含以下内容的列表:

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]]

2 个答案:

答案 0 :(得分:1)

sorted已按字典顺序排序,因此简单命令

>>> sorted([[5, 2], [4, 7], [3, 5]])
[[3, 5], [4, 7], [5, 2]]

就是你所需要的一切。

答案 1 :(得分: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
    
  2. 您只需将更大的元素交换到列表中的第一个位置。如果第二个元素大于第三个元素,则代码永远不能交换它们。而不是硬编码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
    
  3. 现在代码正确递增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
    
  4. 通过所有这些更改,我们最终得到了正确的结果:

    [[3, 5], [4, 7], [5, 2]]