2017-07-15 11 views
0

だから私はいくつかのリストを持っている:別のリストを別のものに基づいて並べ替えますか?

shape1 = [[0, 0], [0, 100], [100, 100], [100, 0]] 
shape2 = [[300, 300], [300, 450], [450, 450], [450, 300]] 
list1 = [shape1, shape2] 
height_y = [100, 150] 

だから私は、その高さ(最小と最大)に基づいて図形をソートします。 height_yリストをソートするのは本当に簡単ですが、高さは同じ位置に関連付けられた図形に基づいています。ですから、height_yをソートすると、リスト1をソートして、ソート後にheight_yリストと同じ位置にシェイプが移動するようにするにはどうすればいいですか?しかし、シェイプリスト内のポイントの配置を変更する必要はありません。

最終目標:

height_y = [150, 100] 
list1 = [shape2, shape1] 

注:私はここでしか2つの形状を使用しています(ポイントによって定義された)が、私は、これは(上向き百の)任意の数の形状で作業できるようにしたいです。

+0

:私は辞書を使用することをお勧めしてからのような値で、それを並べ替えますこれらのオブジェクトのリストは1つだけ必要であり、簡単にソートできます。 –

+0

唯一の問題は、私のデータの大半は編集/変更する必要があるためです(すべての図形が間隔/重力/順序条件を満たすために何度も移動/回転されます)。 – Frank

+0

私はそれがどのように問題であるかわかりません。辞書やカスタムクラスはリスト項目と同様に簡単に編集できます。しかし、私はそれをあなたの言葉を取るでしょう。 –

答えて

5

ただzip emと並べ替えます。

In [489]: list1, height_y = map(list, (zip(*sorted(zip(list1, height_y), key=lambda x: x[1], reverse=True)))) 

In [490]: list1 
Out[490]: [shape2, shape1] # shortened for aesthetic purposes (it's a list of lists) 

In [491]: height_y 
Out[491]: [150, 100] 

内訳

  1. zip(list1, height_y)

  2. sorted(---(1)---, key=lambda x: x[1], reverse=True)

    一緒にファスナー:各タプル(高さ)の最初の値に基づいて、逆にタプルをソート

  3. zip(*---(2)----):タプルを解凍すると、2つのタプルのリストが表示されます

  4. map(list, ---(3)---):あなたが唯一の形状や高さを持っている場合はリスト

+0

'map(list、...)'は必要ありません。アンパックがそれを行います。 – AChampion

+0

@AChampion私は知っている...問題は、リストではなくタプルとして解凍されているという問題です。 –

+1

これは確かにOPの予想される出力に対してより正確です。 – AChampion

1

のリストにタプルのリストを変換します。 「全体的に、より良い解決策は、このような辞書やカスタムクラスとして、一つの場所に形状に関するすべての情報を収集し、その後、あなたするかもしれません

import operator 

dict = {} 
sorted_dict = sorted(dict.items(), key=operator.itemgetter(1)) 
関連する問題