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

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

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 могут сортировать список, следующий за одной осью за раз

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

На каждом уровне мы перебираем список, используя 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