Python: сортировка списка - PullRequest
       30

Python: сортировка списка

0 голосов
/ 13 января 2010

Я хочу отсортировать массив c. Но я не получаю ответа a, b, c, d. Вместо этого я получаю a, b, d, c. Что я могу сделать для сортировки всего массива, а не только одной строки?

РЕДАКТИРОВАТЬ: Я хочу отсортировать числа. И подключенные буквы должны иметь тот же порядок, что и отсортированные числа. извините, мой вопрос не был ясен. Может быть, я должен сначала соединить цифры и буквы. Как это: [[ 'А', 1] [ 'B', 2] ....

a = ['a','b','d','c']
b = [1,2,4,3]
c = [[],[]]
c[0]=a
c[1]=b
c[1].sort()
print(c)

Ответы [ 11 ]

4 голосов
/ 13 января 2010

Давайте посмотрим, что здесь происходит:

# Initialize the lists
a = ['a','b','d','c']
b = [1,2,4,3]
c = [[],[]]

# Assign the lists to positions in c
c[0]=a
c[1]=b

# Sort b, which was assigned to c[1]
c[1].sort()
print(c)

Так что, конечно, вы не можете ожидать, что a будет отсортирован. Попробуйте вместо этого:

# Sort a, which was assigned to c[0]
c[0].sort()

# Sort b, which was assigned to c[1]
c[1].sort()
print(c)

Или, если c переменной длины:

# Sort every list in c
for l in c:
    l.sort()

Редактировать : в ответ на ваш комментарий буквы никак не связаны с цифрами. Если вы хотите, чтобы они были связаны, вам нужно объединить их в структуру, подобную кортежу. Попробуйте:

>>> c = [ (1, 'a'), (2, 'b'), (4, 'd'), (3, 'c') ]
>>> c.sort()
>>> print c 
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]

По умолчанию кортежи сортируются по первому элементу. Обратите внимание, что здесь вы можете использовать любые буквы вместо a, b, c, d, и кортежи все равно будут сортироваться (по номеру).

3 голосов
/ 13 января 2010

Похоже, что вы действительно хотите сделать:

>>> a = ['a', 'z', 'd', 'c']
>>> b = [1,   2,   4,   3]
>>> c = zip(a, b)
>>> c
[('a', 1), ('z', 2), ('d', 4), ('c', 3)]
>>> import operator
>>> c.sort(key=operator.itemgetter(1))
# this would be equivalent: c.sort(key=lambda x: x[1])
>>> c
[('a', 1), ('z', 2), ('c', 3), ('d', 4)]
2 голосов
/ 13 января 2010
>>> a = ['a','b','d','c']
>>> b = [1, 2, 4, 3]
>>> c = zip(a, b)
>>> c
[('a', 1), ('b', 2), ('d', 4), ('c', 3)]
>>> c.sort(key=lambda x: x[1])
>>> c
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
1 голос
/ 13 января 2010

Вы можете попробовать (для Python 3.x):

def sort_a_based_on_b(a, b):
    c = sorted(list(zip(b, a)))
    return list(list(zip(*c))[1]) # Returns the sorted a

Возвращает отсортированное значение a на основе значений в b.

a = ['a','b','d','c']
b = [1,2,4,3]

print(sort_a_based_on_b(a,b))

Отпечатки ['a', 'b', 'c', 'd']

1 голос
/ 13 января 2010
def sort_parallel(a, b):
    ba = zip(b, a)
    ba.sort()
    return [e[1] for e in ba]

a = ['a','b','d','c']
b = [1,2,4,3]

print sort_parallel(a, b)

печать

['a', 'b', 'c', 'd']
1 голос
/ 13 января 2010

Первое, что приходит мне в голову, это использование массива numpy вместо встроенного типа данных list.

Что-то вроде:

>>> from numpy import *
>>> a = array(['a', 'b', 'd', 'c'])
>>> a.sort()
>>> print a
['a' 'b' 'c' 'd']
>>> reshape(a, (2,2))
array([['a', 'b'],
       ['c', 'd']], 
      dtype='|S1')
1 голос
/ 13 января 2010
[sorted(x) for x in c]
0 голосов
/ 13 января 2010

Это то, что вы ищете?

>>> a = ['a','b','d','c']
>>> b = [1, 2, 4, 3]
>>> c = zip(b, a)
>>> c.sort()
>>> c = [(y, x) for (x, y) in c]
>>> print(c)
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
0 голосов
/ 13 января 2010

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


cmp = lambda x,y: (x[1], x[0]) &lt (y[1], y[0])
L.sort(cmp = cmp)

Лямбда - это все анонимная функция, в этом случае она меняет порядок элементов так, что второй элемент становится первичным ключом, а сравнение выполняется с помощью оператора «<». </p>

0 голосов
/ 13 января 2010

Роджер Пейт дал хороший ответ, но вы сказали: «Но теперь он сортирует буквы. Я хочу отсортировать числа».

Вот модифицированная версия ответа Роджера Пейта, которая сортирует c по номерам. Это то, что вы хотите?

>>> def mykey(tup):
>>>     return tup[1]
>>>
>>> a = ['a','b','d','c']
>>> b = [1, 2, 4, 3]
>>> c = zip(a, b)
>>> c
[('a', 1), ('b', 2), ('d', 4), ('c', 3)]
>>> c.sort(key=mykey)
>>> c
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

«Ключ» к функции метода sort() является функцией. Функция возвращает ключ, который вы хотите использовать. Функция mykey() принимает кортеж и возвращает его второе значение (значение с индексом 1). Таким образом, .sort() будет сортировать, используя числовую часть кортежа. И строки будут по-прежнему соответствовать номерам. Вы можете даже разделить список c снова, чтобы восстановить списки a и b, и они все равно будут совпадать.

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