2013-08-27 52 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]] 

我要回去看看Python的排序算法 - 我想,這就是所謂的Timsort,有點我敢肯定就地排序將是更少的內存密集和大約相同的速度。

編輯:按照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