在不使用预建函数或方法的情况下,根据 Python 中特定索引处的最大值对列表列表进行排序

Sort list of lists based on max value at a specific index in Python without the use of prebuilt functions or methods

我有一个列表列表,我想了解如何按索引 1 处的元素对列表进行排序,但如果索引 1 returns 两个项目的编号相同,则还按索引 2 处的元素排序.

我想在不使用内置函数和方法的情况下执行此操作,以便我可以继续加深对列表以及如何操作它们的理解。

回顾一下:

我尝试了一些不同的方法,但无法正常工作。任何帮助将不胜感激。

# initialising list
food_list = (
    ["banana", 10, "f", "yellow"],
    ["apple", 12, "f", "red"],
    ["pear", 60, "f", "green"],
    ["mango", 5, "f", "yellow"],
    ["lettuce", 3, "v", "green"],
    ["beans", 20, "v", "green"],
    ["red capsicum", 1, "v", "red"],
    ["corn", 20, "v", "yellow"],
)

unsorted_food_list_copy = food_list
sorted_food_list = []

while len(unsorted_food_list_copy) != 0:
    maximum = 0
    for food in unsorted_food_list_copy:
        if food[1] > maximum:
            maximum = food[1]
    sorted_food_list.append(maximum)
    unsorted_food_list_copy.remove(maximum)

我也试过这个:

# initialising list
food_list = (
    ["banana", 10, "f", "yellow"],
    ["apple", 12, "f", "red"],
    ["pear", 60, "f", "green"],
    ["mango", 5, "f", "yellow"],
    ["lettuce", 3, "v", "green"],
    ["beans", 20, "v", "green"],
    ["red capsicum", 1, "v", "red"],
    ["corn", 20, "v", "yellow"],
)

unsorted_food_list_copy = food_list
sorted_food_list = []

while unsorted_food_list_copy:
    min = unsorted_food_list_copy[1]
    for x in unsorted_food_list_copy:
        if x < min:
            min = x
    sorted_food_list.append(min)
    unsorted_food_list_copy.remove(min)

在您的代码示例中,您将 food_list 定义为 tuple,同时提及列表列表。为了使用删除、复制或附加等列表功能,您需要在列表两边添加方括号。

首先,您的 food_list 应该这样定义:

food_list = [
    ['banana', 10, 'f', 'yellow'],
    ['apple', 12, 'f', 'red'],
    ['pear', 60, 'f', 'green'],
    ['mango', 5, 'f', 'yellow'],
    ['lettuce', 3, 'v', 'green'],
    ['beans', 20, 'v', 'green'],
    ['red capsicum', 1, 'v', 'red'],
    ['corn', 20, 'v', 'yellow'],
]

其次,在遍历列表之前设置最小值,考虑列表的第一个元素,以便开始寻找较小的整数。

minValue = unsorted_food_list_copy[0]

完整的解决方案:

# initializing list
food_list = [
    ['banana', 10, 'f', 'yellow'],
    ['apple', 12, 'f', 'red'],
    ['pear', 60, 'f', 'green'],
    ['mango', 5, 'f', 'yellow'],
    ['lettuce', 3, 'v', 'green'],
    ['beans', 20, 'v', 'green'],
    ['red capsicum', 1, 'v', 'red'],
    ['corn', 20, 'v', 'yellow'],
]

unsorted_food_list_copy = food_list.copy()
sorted_food_list = []

for i in range(len(unsorted_food_list_copy)):
    minValue = unsorted_food_list_copy[0]
    for x in unsorted_food_list_copy:
        if x[1] < minValue[1]:
            minValue = x
    sorted_food_list.append(minValue)
    unsorted_food_list_copy.remove(minValue)

sorted_food_list_descending = sorted_food_list[::-1]
print(sorted_food_list_descending)

# Ouput
    [['pear', 60, 'f', 'green'],
    ['corn', 20, 'v', 'yellow'],
    ['beans', 20, 'v', 'green'],
    ['apple', 12, 'f', 'red'],
    ['banana', 10, 'f', 'yellow'],
    ['mango', 5, 'f', 'yellow'],
    ['lettuce', 3, 'v', 'green'],
    ['red capsicum', 1, 'v', 'red']]

要按降序执行此操作,您可以这样做:

food_list = [
    ['banana', 10, 'f', 'yellow'],
    ['apple', 12, 'f', 'red'],
    ['pear', 60, 'f', 'green'],
    ['mango', 5, 'f', 'yellow'],
    ['lettuce', 3, 'v', 'green'],
    ['beans', 20, 'v', 'green'],
    ['red capsicum', 1, 'v', 'red'],
    ['corn', 20, 'w', 'yellow'],
]
food_list_copy = food_list.copy()
new_list = []

while food_list_copy:
    hi = food_list_copy[0]
    pi = 0
    for i, e in enumerate(food_list_copy[1:], 1):
        if e[1] > hi[1]:
            hi = e
            pi = i
        elif e[1] == hi[1]:
            if e[2] > hi[2]:
                hi = e
                pi = i
    new_list.append(hi)
    food_list_copy.pop(pi)
print(new_list)

输出:

[['pear', 60, 'f', 'green'],
 ['corn', 20, 'w', 'yellow'],
 ['beans', 20, 'v', 'green'],
 ['apple', 12, 'f', 'red'],
 ['banana', 10, 'f', 'yellow'],
 ['mango', 5, 'f', 'yellow'],
 ['lettuce', 3, 'v', 'green'],
 ['red capsicum', 1, 'v', 'red']]

根据指定 (user-defined) 键对列表进行排序的 pythonic 方法是使用 sortkey 参数。

food_list = [
    ["banana", 10, "f", "yellow"],
    ["apple", 12, "f", "red"],
    ["pear", 60, "f", "green"],
    ["mango", 5, "f", "yellow"],
    ["lettuce", 3, "v", "green"],
    ["beans", 20, "v", "green"],
    ["red capsicum", 1, "v", "red"],
    ["corn", 20, "w", "yellow"],
]

# create a copy (you can also use `copy.deepcopy`) and sort
sorted_food_list = [list(i) for i in food_list]
sorted_food_list.sort(key=lambda i: (-i[1], i[2]))

输出

[['pear', 60, 'f', 'green'],
 ['beans', 20, 'v', 'green'],
 ['corn', 20, 'w', 'yellow'],
 ['apple', 12, 'f', 'red'],
 ['banana', 10, 'f', 'yellow'],
 ['mango', 5, 'f', 'yellow'],
 ['lettuce', 3, 'v', 'green'],
 ['red capsicum', 1, 'v', 'red']]