2013-12-20 2 views
1

я есть массив и заполнить его, как этотсортировке многомерного массива в Python

arr = [[],[]] 
arr[0].append(post.attrib['href']) #strings 
arr[1].append(int(klass)) # int 

и мне нужно, чтобы отсортировать весь массив по обр [1], например, ввода:

[['string3', 'string45', 'string25'], [46, 2, 12]] 

и выход :

[['string45', 'string25', 'string3'], [2, 12, 46]] 

я попытался

arr[0].sort(key = x[1].__getitem__) 
arr[0].sort(key=lambda x: x[1]) 
arr = sorted(arr, key=itemgetter(1)) 

, но все это не работает правильно

+0

Каков результат вашего кода? – albusshin

ответ

7

Как сортируют составные элементы, создать пару из тех элементов, которые вы собираетесь сортировать с помощью (zip или itertools.izip), а также использовать operator.itemgetter, чтобы выбрать правильный ключ , Наконец, транспонируйте обратно в исходный формат, используя zip.

from operator import itemgetter 
zip(*sorted(zip(*arr), key = itemgetter(1))) 
[('string45', 'string25', 'string3'), (2, 12, 46)] 

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

Этапы выполнения

>>> arr #Original Array 
[['string3', 'string45', 'string25'], [46, 2, 12]] 
>>> zip(*arr) #Unpacking the array, transposes it 
[('string3', 46), ('string45', 2), ('string25', 12)] 
>>> sorted(zip(*arr), key = itemgetter(1)) #Sort the Transpose Array based on second element 
[('string45', 2), ('string25', 12), ('string3', 46)] 
>>> zip(*sorted(zip(*arr), key = itemgetter(1))) #Transpose the result to generate the original format 
[('string45', 'string25', 'string3'), (2, 12, 46)] 
+0

Что именно делает «*» перед сортировкой? Я никогда не видел, чтобы он использовался перед встроенной функцией до – Totem

+1

'*' используется для [Распаковка списков аргументов] (http://docs.python.org/2/tutorial/controlflow.html#unpacking-argument- списки) – Abhijit

+0

Я знаю это, но я просто не понимаю, как это работает при применении к 'sorted' – Totem

0

Я считаю, упаковка и распаковка аргументы немного неинтуитивными в разы, так

l = [['string3', 'string45', 'string25'], [46, 2, 12]] 
[[y[1] for y in sorted(zip(l[1], x))] for x in l] 
[['string45', 'string25', 'string3'], [2, 12, 46]] 
0

Рассматривали ли вы хранить данные в виде одного списка 2-го элемента пары (например, [(46, 'string3'), (2, 'string45'), (12, 'string25')])? Потому что, если вы сделали это, ваша проблема будет решать сам в одной строке кода:

l = [(46, 'string3'), (2, 'string45'), (12, 'string25')] 
print sorted(l) 
# [(2, 'string45'), (12, 'string25'), (46, 'string3')] 

Кстати, они списки, а не массивы. Массивы в Python означают что-то другое (а именно массивы NumPy).

+0

да, я знаю), но обычно после js я называю его массивами) –

Смежные вопросы