2017-07-15 171 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进行排序,那么如何对list1进行排序,以便在排序后形状移动到与height_y列表相同的位置?然而,我不想让形状列表中的点的布置改变。

最终目标:

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

注:我只使用两个形状这里(由点定义),但我想这是能够与多种形状的工作(向上一百岁)。

+0

一个整体更好的解决方案可能是收集在一个地方所有关于形状的信息,比如字典或自定义类,然后” d只需要这些对象的一个​​列表,这很容易被分类。 –

+0

唯一的问题是我的大部分数据需要留在列表中,因为它需要在运行中进行编辑/更改(所有形状都会一次又一次地移动/旋转以满足间距/重力/排序条件)。 – Frank

+0

我不明白这是什么问题;字典和自定义类的编辑就像列表条目一样简单。但我会接受你的话。 –

回答

5

只需zip时间和排序。

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)----):解压元组,你得到两个元组列表

  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))