首页 > 解决方案 > 如何根据元组中的变量对元组列表进行排序

问题描述

给定一个以这种格式 (item,[dependency, priority]) 的元组列表,其中第一个元素表示一个项目,第二个元素的第一个元素表示对先前列出的项目的依赖(这意味着,第一个元素必须出现在它所依赖的第二个项目之前的列表出现),最后第三个元素指示相似依赖项的排名优先级。示例列表如下所示:

[(1, [0, 4]),  
(2, [0, 3]),  
(3, [1, 4]),  
(4, [1, 1]),  
(5, [2, 4])]

我需要一种对列表进行排序的方法,以便满足依赖性的项目可以比具有较低优先级但具有较少或没有依赖性的项目排名更高。

例如,在上面的列表中,第三项 (3, [1, 4]) 的优先级高于第二项 (2, [0, 3]),因此应该在第二位。示例列表的期望输出应该是这样的:

[(1, [0, 4]),  
(3, [1, 4]),  
(2, [0, 3]), 
(5, [2, 4]),
(4, [1, 1])]

我不能简单地按优先级排序,因为这会将第五项 5, [2, 4]) 提升到高于其依赖项 2 的位置。

所以我的想法是遍历列表,将满足依赖关系的所有项目分组。然后按优先级对该列表进行排序。然后将所有结果列表重新组合成一个列表。

我无法弄清楚如何做到这一点。我最好的尝试是下面这样。依赖为 n。但它只适用于第一次迭代。当依赖项大于 1 时,它返回所有项。我怀疑这不是实现预期结果的最佳策略。

任何想法或建议将不胜感激!


    def rank_poss(array,n):
      final = []
      slot_list = []
      for i in array:
          if i[1][0] <= n and i[0] != 1:
              slot_list.append(i)  
      temp = sorted(slot_list, reverse=True, key = lambda x: x[1][2])
      final.append(temp)
      return final 

标签: python

解决方案


我不知道我是否正确理解了你的规则,所以我不知道我是否得到正确的结果。

在较旧的 Python 中,您可以使用参数cmp=sorted(以及一些其他函数)来分配从列表中获取两个项目的函数,比较它们并在它们相同时返回,当第一个应该在第二个之前,当第二个应该在第一个之前。0-11

新的 Python 没有这个参数,但是函数functools.cmp_to_key()应该有助于像旧的一样工作cmp=,然后你可以尝试创建更复杂的方法来对项目进行排序。

data = [
    (1, [0, 4]),  
    (2, [0, 3]),  
    (3, [1, 4]),  
    (4, [1, 1]),  
    (5, [2, 4])
]

import functools
    
def compare(a, b):
    if a[1][0] >= b[0]:
        return 1
    if a[1][1] > b[1][1]:
        return -1
    return 1

result = sorted(data, key=functools.cmp_to_key(compare))
     
for item in result:
    print(item)

结果:

(1, [0, 4])
(3, [1, 4])
(2, [0, 3])
(5, [2, 4])
(4, [1, 1])

推荐阅读