2

私はプログラミングに比較的慣れていないので、各サブ配列のすべての項目の値で 2 次元配列 (Python で呼び出されるリスト) を並べ替えたいと考えています。例えば:

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

1 + 5 + 3 = 9 であるため、 pop の最初の要素の合計は 9 になります。1 + 1 + 1 = 3 であるため、2 番目の要素の合計は 3 になります。

これを並べ替えて、新しい順序が次のようになるようにします。

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

どうすればいいですか?

注:各サブ配列の要素を並べ替えるのではなく、各サブ配列のすべての数値の合計に従って並べ替えます。

4

3 に答える 3

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)。元のリストを確実に保持したい場合を除き、インペース ソートを優先する必要があります。

于 2013-08-27T23:06:21.067 に答える
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
于 2013-08-27T23:07:00.400 に答える
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 と呼ばれていると思いますが、インプレース ソートの方がメモリ消費量が少なく、ほぼ同じ速度になると確信しています。

編集:この回答によると、私は間違いなくお勧めしますx.sort()

従来とは異なる方法でリストを並べ替えたい場合は、独自の関数を作成できます (1 つのパラメーターを使用します) lambda

たとえば、最初の数値を 2 番目の数値よりも大きく、3 番目の数値よりも大きく重み付けする場合は、次のようにします。

>>> 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]]
于 2013-08-27T23:14:02.563 に答える