Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据其他列表对其他列表进行排序?_Python_List_Sorting - Fatal编程技术网

Python 根据其他列表对其他列表进行排序?

Python 根据其他列表对其他列表进行排序?,python,list,sorting,Python,List,Sorting,所以我有一些清单: 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] 因此,我想根据形状的高度(从大到小)对其进行排序。对高度列表进行排序非常容易,但是高度基于与相同位置相关的形状。因此,如果我对高度列表进行排序,如何对列表1进行排序,使

所以我有一些清单:

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]
因此,我想根据形状的高度(从大到小)对其进行排序。对高度列表进行排序非常容易,但是高度基于与相同位置相关的形状。因此,如果我对高度列表进行排序,如何对列表1进行排序,使形状在排序后移动到与高度列表相同的位置?但是,我不希望形状列表中的点的排列发生变化

最终目标:

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

注意:我在这里只使用了两个形状(由点定义),但我希望它能够处理任意数量的形状(最多100个)。

仅使用
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]
细分:

  • zip(列表1,高度)
    :将它们压缩在一起

  • 排序(---(1)--,key=lambda x:x[1],reverse=True)
    :根据每个元组中的第一个值(高度)对元组进行反向排序

  • zip(*--(2)--
    :解压缩元组,您将得到两个元组的列表

  • map(list,--(3)--)
    :将元组列表转换为列表列表


  • 只需
    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]
    
    细分:

  • zip(列表1,高度)
    :将它们压缩在一起

  • 排序(---(1)--,key=lambda x:x[1],reverse=True)
    :根据每个元组中的第一个值(高度)对元组进行反向排序

  • zip(*--(2)--
    :解压缩元组,您将得到两个元组的列表

  • map(list,--(3)--)
    :将元组列表转换为列表列表


  • 如果你只有形状和高度。我建议使用字典,然后按值排序,如:

     import operator
    
     dict = {}
     sorted_dict = sorted(dict.items(), key=operator.itemgetter(1))
    

    如果你只有形状和高度。我建议使用字典,然后按值排序,如:

     import operator
    
     dict = {}
     sorted_dict = sorted(dict.items(), key=operator.itemgetter(1))
    

    总体而言,更好的解决方案可能是在一个位置收集有关形状的所有信息,例如dict或自定义类,然后您只需要一个易于排序的对象列表。唯一的问题是,我的大部分数据需要保留在列表中,因为它需要动态编辑/更改(所有形状反复移动/旋转以满足间距/重力/排序条件)。我不认为这是一个问题;dict和自定义类与列表项一样容易编辑。但我相信你的话。总体上更好的解决方案可能是将形状的所有信息收集到一个位置,例如dict或自定义类,然后只需要一个易于排序的对象列表。唯一的解决方案是问题是,我的大部分数据需要保留在列表中,因为它需要动态编辑/更改(所有形状都会反复移动/旋转,以满足间距/重力/排序条件).我不认为这是一个问题;DICT和自定义类的编辑与列表条目一样容易。但我相信你的话。你不需要
    map(list,…)
    unpackaging可以帮你做到这一点。@AChampion我知道…问题是它们被解包为元组,而不是列表。这确实比OP的预期输出更准确。你不需要
    map(list,…)
    解包就可以了。@AChampion我知道……问题是它们被解包为元组,而不是列表。这确实更准确地反映了OP的预期输出。