Список сортировки Python и связанный список - PullRequest
1 голос
/ 11 февраля 2012

У меня довольно простой вопрос, и я нашел несколько ответов на этот вопрос, но я просто не могу обойти его.

У меня есть список значений x (для графика) истоль же длинный список значений у.Я хочу отсортировать список значений y и соответственно обновить свой список x.Предположим, у меня есть эти списки

xVars = [1,2,3,4,5]
yVars = [9,7,1,3,5] 

После сортировки это результат, который я хочу:

xVars = [3,4,5,2,1]
yVars = [1,3,5,7,9] #this is now sorted

Моя цель в этом заключается в том, что я хочу построить максимальные значения y с помощьюсвязанные значения x.

Я столкнулся с функцией itemgetter () и отсортированным (key =), но я не понимаю ни то, ни другое (то есть они не работают, но это скорее), потому что я их не понимаю, а не этопотому что они не будут работать).

Заранее большое спасибо!

РЕДАКТИРОВАТЬ: Большое спасибо всем вам, я хотел бы выбрать всех вас как правильный ответно, к сожалению, я могу.Ваши объяснения были очень полезны, и теперь я узнал немного больше о питоне.Спасибо!:)

Ответы [ 5 ]

4 голосов
/ 11 февраля 2012
>>> tmp = sorted(zip(xVars, yVars),key=lambda x: x[1])
>>> xVars = [x[0] for x in tmp]
>>> yVars = [x[1] for x in tmp]
>>> xVars
[3, 4, 5, 2, 1]
>>> yVars
[1, 3, 5, 7, 9]
1 голос
/ 11 февраля 2012

Здесь вы можете использовать функцию zip(), чтобы сделать это красиво. Сначала мы упаковываем значения в пары.

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

Теперь мы используем zip с оператором splat, чтобы отменить процедуру архивирования, в результате чего получается хороший однострочный:

yVars, xVars = zip(*sorted(zip(yVars, xVars)))

Который производит желаемый результат:

>>> xVars = [1,2,3,4,5]
>>> yVars = [9,7,1,3,5] 
>>> yVars, xVars = zip(*sorted(zip(yVars, xVars)))
>>> xVars
(3, 4, 5, 2, 1)
>>> yVars
(1, 3, 5, 7, 9)

Обратите внимание, что это кортежи, поэтому, если вам снова нужны списки, просто выполните yVars, xVars = list(yVars), list(xVars) впоследствии.

Если вы хотите расширить это до более чем двух списков, просто добавьте больше аргументов в zip, и он вернет больше.

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

yVars, xVars = zip(*sorted(zip(yVars, xVars), key=lambda item: item[0]))
0 голосов
/ 11 февраля 2012

На самом деле вам не нужно использовать zip для этого. Просто отсортируйте xVars, используя yVars в качестве ключа сортировки, затем вы можете использовать новый xVars, чтобы перестроить yVars в правильном порядке:

>>> xVars = [1,2,3,4,5]
>>> yVars = [9,7,1,3,5]
>>> xVars = sorted(xVars, key=lambda i: yVars[i-1])
>>> yVars = [ yVars[i-1] for i in xVars ]
>>> xVars
[3, 4, 5, 2, 1]
>>> yVars
[1, 3, 5, 7, 9]

Кроме того, если, как вы говорите, вы просто хотите получить самые большие значения y со связанными с ними значениями x, вы можете использовать heapq.nlargest вместо сортировки всего списка. Если у вас длинные списки и вы хотите использовать только несколько больших значений, это может быть более эффективным:

>>> xVars = [1,2,3,4,5]
>>> yVars = [9,7,1,3,5]
>>> from heapq import nlargest
>>> x_largest = nlargest(3, xVars, key=lambda i: yVars[i-1])
>>> y_largest = [ yVars[i-1] for i in x_largest ]
>>> x_largest, y_largest
([1, 2, 5], [9, 7, 5])
0 голосов
/ 11 февраля 2012

Функция сортировки (ключ =) работает следующим образом

xVars = [1,2,3,4,5]
yVars = [9,7,1,3,5]


xyZipped = zip(xVars, yVars)
sorted(xyZipped, key=lambda xyZipped: xyZipped[1])
print(xyZipped)

Ключ - это функция (в данном случае лямбда-функция), которая возвращает один аргумент для сортировки. Лямбда-функция возвращает второй элемент в кортеже, то есть yVar, который был заархивирован с соответствующим xVar

0 голосов
/ 11 февраля 2012

Проверьте zip и отсортированные функции ...

zip(y,x) вернет СПИСОК кортежей [(y1, x1), (y2, x2), ...]

sorted(zip(y,x)) отсортирует этот список - по умолчанию по первому значению в кортежах (у)

затем вы можете превратить это обратно в отдельные списки, используя списочные выражения.

>>> xVars = [1,2,3,4,5]
>>> yVars = [9,7,1,3,5] 
>>> sorted_list= sorted(zip(yVars,xVars))
>>> sorted_x = [ b for a,b in sorted_list ]
>>> sorted_y = [ a for a,b in sorted_list ]
>>> print(sorted_x)
[3, 4, 5, 2, 1]
>>> print(sorted_y)
[1, 3, 5, 7, 9]

Здесь есть пара моментов - чтобы упростить sort (), я изменил порядок x и y, чтобы он автоматически сортировал значения y.

Если вы еще не знакомы со списками, вот эквивалентный синтаксис ...

squares = [x**2 for x in range(10)]

совпадает с ...

>>> squares = []
>>> for x in range(10):
...     squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...