Сортировка списков списка

У меня есть список, содержащий числа. Я хочу отсортировать один из списков, а затем убедиться, что другие списки расположены в порядке отсортированного списка. Все списки имеют одинаковый размер.

import numpy as np

# Example list of lists with numbers
list_of_lists = [[5, 8, 9], [1, 4, 7], [6, 3, 2]]

# Convert lists to NumPy arrays
arrays = [np.array(lst) for lst in list_of_lists]

# Sort the first array
sorted_array = np.sort(arrays[0])

# Initialize a list to hold the reordered arrays
reordered_arrays = [sorted_array]  # Start with the sorted array

# Function to reorder an array based on the sorted positions of its elements
def reorder_array(arr, sorted_positions):
    reordered_arr = np.full_like(sorted_array, fill_value=np.nan)  # Initialize with NaNs
    for pos, val in enumerate(sorted_positions):
        if val in arr:
            idx = np.where(arr == val)[0][0]  # Find the index of the current value in the unsorted array
            reordered_arr[pos] = arr[idx]  # Place the value from the original array at the correct position
    return reordered_arr

# Reorder the other arrays
for arr in arrays[1:]:
    sorted_positions = np.argsort(arr)  # Find the sorted positions of elements in the current array
    reordered_arr = reorder_array(arr, sorted_positions)
    reordered_arrays.append(reordered_arr)


print(reordered_arrays)

Будете ли вы всегда хотеть сортировать по значениям в первом подсписке со списком (arrays[0]) или это может быть любой из подсписков?

Matt Pitkin 09.08.2024 11:07

Подойдет любой подсписок. Просто, как только я отсортирую один из них, остальные должны быть переставлены в том же порядке.

Maaz Khan 09.08.2024 11:10
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
54
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Можете ли вы дать мне ожидаемый результат? Основываясь на вашем вопросе, вот мой упрощенный код:

import numpy as np

# Example list of lists with numbers
list_of_lists = [[5, 8, 9], [1, 4, 7], [6, 3, 2]]

# Convert lists to NumPy arrays
arrays = np.array(list_of_lists)

# Get the indices that would sort the first array
sorted_indices = np.argsort(arrays[2])

# Reorder all arrays based on these sorted indices
reordered_arrays = arrays[:, sorted_indices]

# Convert back to a list of lists if needed
reordered_lists = reordered_arrays.tolist()

print(reordered_lists) # [[9, 8, 5], [7, 4, 1], [2, 3, 6]]

Вы можете изменить np.argsort(arrays[...]) по своему желанию.

Ответ принят как подходящий

Если у вас есть этот массив:

list_of_lists = [[9, 5, 8], [1, 4, 7], [6, 3, 2]]
arr = np.array(list_of_lists)
print(arr)

[[9 5 8]
 [1 4 7]
 [6 3 2]]

Тогда вы можете сделать:

arr2 = arr[:, np.argsort(arr[0])]
print(arr2)

Распечатки:

[[5 8 9]
 [4 7 1]
 [3 2 6]]

Вы можете использовать функцию key функции Python sorted, например:

list_of_lists = [[5, 8, 9], [1, 4, 7], [6, 3, 2]]

# Convert lists to NumPy arrays
arrays = np.array(list_of_lists)

# list index to sort on
sortidx = 2

sorted_array = np.array(sorted(arrays.T, key=lambda a: a[sortidx])).T

print(sorted_array)
[[9 8 5]
 [7 4 1]
 [2 3 6]]

Другие вопросы по теме