2013-08-27 2 views
2

Я относительно новичок в программировании, и я хочу сортировать двухмерный массив (списки, поскольку они вызывается в Python) по значению всех элементов в каждом подматрице. Например:sort 2-D list python

pop = [[1,5,3],[1,1,1],[7,5,8],[2,5,4]] 

Сумма первого элемента поп-музыки будет 9, потому что 1 + 5 + 3 = 9. Сумма второго будет 3, потому что 1 + 1 + 1 = 3, и скоро.

Я хочу, чтобы изменить это, чтобы новый порядок будет:

newPop = [pop[1], pop[0], pop[3], pop[2]] 

Как мне это сделать?

Примечание: я не хочу сортировать элементы в каждом подматрице, но сортировать по сумме всех чисел в каждом подматрице.

ответ

1

@arshajii бил меня на удар, и его ответ хорош. Тем не менее, если вы предпочли бы на месте рода:

>>> pop = [[1,5,3],[1,1,1],[7,5,8],[2,5,4]] 
>>> pop.sort(key=sum) 
>>> pop 
[[1, 1, 1], [1, 5, 3], [2, 5, 4], [7, 5, 8]] 

я должен искать алгоритм сортировки Питона - я думаю, что это называется Timsort, немного я уверен, что в-месте вроде бы меньше памяти интенсивной и примерно такой же скорости.

Edit: По this ответ, я бы определенно рекомендовал x.sort()

Если вы хотите, чтобы сортировать списки в менее традиционным способом, вы можете написать свою собственную функцию (которая принимает один параметр.) На риск запуска пламя войны, я бы настоятельно советовал против lambda.

Например, если вы хотите, первый номер, чтобы быть взвешенным в большей степени, чем второй номер большей степени, чем третий номер, и т.д.:

>>> def weightedSum(listToSum): 
...  ws = 0 
...  weight = len(listToSum) 
...  for i in listToSum: 
...   ws += i * weight 
...   weight -= 1 
...  return ws 
... 
>>> weightedSum([1, 2, 3]) 
10 
>>> 1 * 3 + 2 * 2 + 3 * 1 
10 
>>> pop 
[[1, 5, 3], [1, 1, 1], [7, 5, 8], [2, 5, 4]] 
>>> pop.sort(key=weightedSum) 
>>> pop 
[[1, 1, 1], [1, 5, 3], [2, 5, 4], [7, 5, 8]] 
>>> pop += [[1, 3, 8]] 
>>> pop.sort(key=weightedSum) 
>>> pop 
[[1, 1, 1], [1, 5, 3], [1, 3, 8], [2, 5, 4], [7, 5, 8]] 
4

Вы можете использовать sorted():

>>> pop = [[1,5,3],[1,1,1],[7,5,8],[2,5,4]] 
>>> newPop = sorted(pop, key=sum) 
>>> newPop 
[[1, 1, 1], [1, 5, 3], [2, 5, 4], [7, 5, 8]] 

Вы можете также отсортировать в месте с pop.sort(key=sum). Если вы определенно не хотите сохранить исходный список, вам следует выбрать сортировку в темпе.

+0

в месте сортировка рекомендуется, если вы абсолютно не нужен новый список (+1 в любом случае) – inspectorG4dget

+0

@ inspectorG4dget Конечно, я добавил подход для этого. – arshajii

2

Попробуйте это:

sorted(pop, key=sum) 

Объяснение:

  • Процедура sorted() сортирует итерацию (список в данном случае) в порядке возрастания
  • Необязательно параметр key может быть передана определить, какое свойство элементов в списке будет использоваться для сортировки
  • В этом случае это свойство sum каждого из элементов (которые подсписки)

Так по существу это то, что происходит:

[[1,5,3], [1,1,1], [7,5,8], [2,5,4]]    # original list 
[sum([1,5,3]), sum([1,1,1]), sum([7,5,8]), sum([2,5,4])] # key=sum 
[9, 3, 20, 11]         # apply key 
sorted([9, 3, 20, 11])       # sort 
[3, 9, 11, 20]         # sorted 
[[1,1,1], [1,5,3], [2,5,4], [7,5,8]]    # elements coresponding to keys 
+0

Почему 'reverse = True'? – arshajii

+0

Нет, это было исправлено. –

+0

. Сортировка на месте рекомендуется, если вам не нужен новый список (+1 в любом случае) – inspectorG4dget