Многоэлементная сортировка на основе двух разных элементов списка и переупорядочение / перестановка? - PullRequest
0 голосов
/ 05 января 2012

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

li = [['m', 'z', 'asdgwergerwhwre'], 
      ['j', 'h', 'asdgasdgasdgasdgas'], 
      ['u', 'a', 'asdgasdgasdgasd'], 
      ['i', 'o', 'sdagasdgasdgdsag']]

Я бы хотел отсортировать этот список по алфавиту, НО используя первый или второй элемент в каждом подсписке.Для приведенного выше примера желаемым результатом будет:

['a', 'u', 'asdgasdgasdgasd']
['h', 'j', 'asdgasdgasdgasdgas']
['i', 'o', 'sdagasdgasdgdsag']
['m', 'z', 'asdgwergerwhwre']

Каков наилучший способ достижения этого вида?

Ответы [ 3 ]

1 голос
/ 05 января 2012

В качестве первого шага мы выполняем некоторую трансформацию (меняем местами первые два элемента - если необходимо) и выполняем вторую простую сортировку:

>>> sorted(map(lambda x: sorted(x[:2]) + [x[2]], li))
[['a', 'u', 'asdgasdgasdgasd'],
 ['h', 'j', 'asdgasdgasdgasdgas'],
 ['i', 'o', 'sdagasdgasdgdsag'],
 ['m', 'z', 'asdgwergerwhwre']]
1 голос
/ 05 января 2012

Вы можете использовать встроенный метод sorted(), чтобы выполнить часть этого.Вам придется изменить порядок списка, если вы хотите изменить способ его печати, но это не так сложно сделать.

def rev(li):
    for l in li:
        l[0], l[1] = l[1], l[0]
    return li

new_list = sorted(rev(li))

Если вы хотите отсортировать список на основе определенного индекса, вы можете использовать sorted(li, key=lambda li: li[index]).

0 голосов
/ 06 января 2012
import pprint
li = [['m', 'z', 'asdgwergerwhwre'],
      ['j', 'h', 'asdgasdgasdgasdgas'],
      ['u', 'a', 'asdgasdgasdgasd'],
      ['i', 'o', 'sdagasdgasdgdsag']]

for _list in li:
    _list[:2]=sorted(_list[:2])

pprint.pprint(sorted(li))

>>>
[['a', 'u', 'asdgasdgasdgasd'],
 ['h', 'j', 'asdgasdgasdgasdgas'],
 ['i', 'o', 'sdagasdgasdgdsag'],
 ['m', 'z', 'asdgwergerwhwre']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...