使用多个条件对列表列表进行排序(Python)

时间:2017-04-24 12:21:19

标签: python sorting

对于作业,我必须创建自己的排序算法来对包含足球比分的列表进行排序。

信息的格式如下(有多个这样的子列表):

['Netherlands', 7, 6, 0, 1, 12, 6, 6, 18]

首先应根据索引8进行排序,然后如果索引8的数字相同,则应根据索引7进行排序,等等

我已经设法根据索引8对其进行排序,但之后却陷入困境。所以我在这里使用选择排序:

def Sorting(List, sortVar):

    for index in range(len(List)):
        cur_pos = stats[index][sortVar]
        high = List[index]
        loc = index

        for i in range(index,len(List)):
            if stats[i][sortVar] > cur_pos:
                cur_pos = List[i][sortVar]
                high = List[i]
                loc = i

        temp = List[index]
        List[index] = high
        List[loc] = temp


    print("")
    print(List)
    return List

然后在此之后我尝试了一些东西但却陷入困境。可能是一个非常简单的问题,但我真的很挣扎。谢谢!

编辑:我看过一些帖子解释了这一点,但我不理解它们,它们都使用了内置的排序功能,我不允许这样做...

2 个答案:

答案 0 :(得分:2)

这是basic bubble sort

def bubble_sort(items):
    """ Implementation of bubble sort """
    for i in range(len(items)):
        for j in range(len(items) - 1 - i):
            if items[j] > items[j + 1]:
                items[j], items[j + 1] = items[j + 1], items[j]     # Swap!

这是一个经过修改的冒泡排序。它只是在比较它们之前反转两个项目。两个比较元素必须理解[::-1]

def modified_bubble_sort(items):
    for i in range(len(items)):
        for j in range(len(items) - 1 - i):
            # Reverse the lists before comparing them
            if items[j][::-1] > items[j + 1][::-1]:
                items[j], items[j + 1] = items[j + 1], items[j]     # Swap!

效率不高,因为冒泡排序为O(n ** 2),修改后的版本继续反转相同的列表,但它非常简洁明了。

这是一个测试:

scores = [
    ['Netherlands', 7, 6, 0, 1, 12, 6, 6, 19],
    ['Netherlands', 7, 6, 0, 1, 12, 6, 6, 19],
    ['Netherlands', 7, 6, 0, 1, 12, 6, 7, 18],
    ['Netherlands', 7, 6, 0, 1, 12, 6, 6, 18],
    ['Spain', 7, 6, 0, 1, 12, 6, 7, 18]
]

modified_bubble_sort(scores)
print(scores)

请注意,它修改了原始列表。它输出:

[['Netherlands', 7, 6, 0, 1, 12, 6, 6, 18], ['Netherlands', 7, 6, 0, 1, 12, 6, 7, 18], ['Spain', 7, 6, 0, 1, 12, 6, 7, 18], ['Netherlands', 7, 6, 0, 1, 12, 6, 6, 19], ['Netherlands', 7, 6, 0, 1, 12, 6, 6, 19]]

与以下结果相同:

print(sorted(scores, key=lambda l: l[::-1]))

答案 1 :(得分:0)

我想说最简单的方法(如果允许使用内置函数)是反转每个子列表,按字母顺序排序,然后重新反转每个子列表。

def my_sort(l):
    # Reverse so you can sort numerically-lexicographically
    reversed_lists = [x[::-1] for x in l]

    # Sort "normally" (i.e., numerically-lexicographically)
    reversed_lists.sort()

    # Re-reverse each sublist so they fit your expected return format
    return [x[::-1] for x in reversed_lists]

在行动here中查看。

如果您不允许使用内置插件,则需要自行设计排序位,但逻辑仍然相同。

您也可以使用key kwarg对反向子列表进行排序:

def my_sort(l):
    return list(sorted(l, key=lambda subl: subl[::-1]))