在不使用预建函数或方法的情况下,根据 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 处的元素排序.
我想在不使用内置函数和方法的情况下执行此操作,以便我可以继续加深对列表以及如何操作它们的理解。
回顾一下:
- 我有列表列表
- 每个子列表具有相同数量的元素
- 我试图通过创建一个新的未排序列表(我不想修改原始未排序列表)并遍历未排序列表的副本来按降序对它们进行排序获取(从索引 1 开始)中的最高数字,然后将其附加到新创建的 sorted_lists 变量
- 然后我从原始未排序列表中删除该列表
- 我重复这个过程,直到将剩余的具有最高值的列表一一添加到新的排序列表中并从原始列表中删除
我尝试了一些不同的方法,但无法正常工作。任何帮助将不胜感激。
# 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 方法是使用 sort
和 key
参数。
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']]
我有一个列表列表,我想了解如何按索引 1 处的元素对列表进行排序,但如果索引 1 returns 两个项目的编号相同,则还按索引 2 处的元素排序.
我想在不使用内置函数和方法的情况下执行此操作,以便我可以继续加深对列表以及如何操作它们的理解。
回顾一下:
- 我有列表列表
- 每个子列表具有相同数量的元素
- 我试图通过创建一个新的未排序列表(我不想修改原始未排序列表)并遍历未排序列表的副本来按降序对它们进行排序获取(从索引 1 开始)中的最高数字,然后将其附加到新创建的 sorted_lists 变量
- 然后我从原始未排序列表中删除该列表
- 我重复这个过程,直到将剩余的具有最高值的列表一一添加到新的排序列表中并从原始列表中删除
我尝试了一些不同的方法,但无法正常工作。任何帮助将不胜感激。
# 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 方法是使用 sort
和 key
参数。
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']]