сортировка списка списков и получение индексов в несортированном списке

Это логические шаги, которые мне нужно выполнить в моем списке списков

a = [[5,2],[7,4],[0,3]] 
  1. сортируйте список списков таким образом, чтобы результат выглядел примерно так:

     7,5,4,3,2,0 
  2. взять координаты отсортированных элементов в исходном списке, которые в этом случае должны выводиться как выходные данные

     (1,0) (0,0) (1,1) (2,1) (0,1) (2,0) 

Я пытался использовать sort, sorted и argwhere по-разному, но я не получаю разумных результатов, я думаю, прежде всего потому, что sort и sorted могут сортировать список, следующий за одной осью за раз

5 Solutions collect form web for “сортировка списка списков и получение индексов в несортированном списке”

Этот код будет работать для списка списков. Внутренние списки не должны иметь одинаковую длину.

На каждом уровне мы перебираем список, используя enumerate чтобы получить элемент списка и его индекс. На верхнем уровне каждый элемент представляет собой другой список, а внутренний цикл итерации по каждому из этих списков получает свои индексы и значения, сохраняя индексы (как кортеж) в кортеже, который также содержит значение. Затем мы сортируем полученный список кортежей ( b ) по значениям, а затем разбиваем его, используя zip в кортеж всех индексов и кортеж значений.

 from operator import itemgetter a = [[5, 2], [7, 4], [0, 3]] b = [((i, j), v) for i, t in enumerate(a) for j, v in enumerate(t)] b.sort(key=itemgetter(-1), reverse=True) print(b) coords, vals = zip(*b) print(vals) print(coords) 

вывод

 [((1, 0), 7), ((0, 0), 5), ((1, 1), 4), ((2, 1), 3), ((0, 1), 2), ((2, 0), 0)] (7, 5, 4, 3, 2, 0) ((1, 0), (0, 0), (1, 1), (2, 1), (0, 1), (2, 0)) 

Создайте словарь с ключами как фактические координаты и значения как сами числа, например

 >>> a = [[5, 2], [7, 4], [0, 3]] >>> positions = { ... (idx1, idx2): col ... for idx1, row in enumerate(a) ... for idx2, col in enumerate(row) ... } >>> positions {(0, 1): 2, (2, 0): 0, (0, 0): 5, (1, 0): 7, (1, 1): 4, (2, 1): 3} 

Теперь отсортируйте ключи (координаты) positions на основе их значений, например

 >>> sorted(positions, key=positions.get, reverse=True) [(1, 0), (0, 0), (1, 1), (2, 1), (0, 1), (2, 0)] 

Вы можете использовать ряд списков и zip блоков, хотя читаемость страдает:

 n, idxs = zip(*sorted(zip([i for sl in a for i in sl], [(col, row) for col in range(len(a)) for row in range(len(a[col]))]), key=lambda x: x[0], reverse=True)) print n, idxs >>> (7, 5, 4, 3, 2, 0) ((1, 0), (0, 0), (1, 1), (2, 1), (0, 1), (2, 0)) 

Если вам нужен диктофон, просто замените слой zip(*..) на dict()

Используйте Numpy , который намного быстрее, чем обычный код python, когда вы имеете дело с более крупными массивами:

 In [21]: a = np.array([[5,2],[7,4],[0,3]]) In [22]: x, y = np.unravel_index((-a).argsort(axis=None), a.shape) In [23]: indices = np.column_stack((x, y)) In [24]: indices Out[24]: array([[1, 0], [0, 0], [1, 1], [2, 1], [0, 1], [2, 0]]) In [25]: a[x, y] Out[25]: array([7, 5, 4, 3, 2, 0]) 

Вы можете сгладить список, а затем использовать его для сортировки и поиска индексов.

 a = [[5,2],[7,4],[0,3]] c = reduce(lambda x, y: x+y, a) b = sorted(c, reverse=True) for i in b: print c.index(i)/2, c.index(i)%2 

Вывод:

 1 0 0 0 1 1 2 1 0 1 2 0 
  • Получите максимальное значение из списка со списками?
  • Доступ к нескольким элементам списка, зная их индекс
  • Добавить элемент в список рекурсивно
  • Как заполнить список
  • Какова базовая структура данных для списков Python?
  • получение списка без элемента k'th эффективно и без разрушения
  • Как преобразовать числовые диапазоны строк в список в Python
  • Оптимизация расчета расстояния Python при учете периодических граничных условий
  •  
    Interesting Posts for Van-Lav

    Прозрачная цветовая палитра

    Часы и эфемерный узел не работают, когда состояние zookeeper изменяется автоматически?

    Caffe install на ubuntu для anaconda с python 2.7 сбой с libpng16.so.16 не найден

    базовые групповые операции в Dask

    Python 3.4: PyQt для Windows: сбой при выходе только на некоторых компьютерах

    Преобразование строки (с научной нотацией) в int в Python

    Встраивание Vs Linking в MongoDB.when для встраивания и когда ссылки?

    Запрос базы данных Django: как фильтровать объекты по диапазону дат?

    Быстрый алгоритм вычисления Adamic-Adar

    При проверке, нет ли элемента в списке, почему этот код не работает – если элемент в списке == False:

    Извлечь подстроку из строки в dataframe

    Как получить результат выполнения команды QProcess в PySide?

    Перекрытие обнаружения сообщества с помощью играфа или других библиотек

    извлекать данные из словаря, возвращаемого pycurl

    С Python я могу сохранить постоянный словарь и изменить его?

    Python - лучший язык программирования в мире.