Python根据另一个列表排序一个列表

时间:2015-02-19 08:29:18

标签: python list sorting

我有两个列表,第一个列表是键盘顺序,第二个列表是元组列表。

colorOrder = ['red', 'blue', 'yellow', 'green']
tupleList = [(111,'red'),(222,'pink'),(333,'green')]

请注意这两个列表不是一对一的关系。某些颜色不在colorOrder中,而colorOrder中的某些颜色从未出现在tupleList中。所以它与其他类似的重复问题不同。

我需要根据colorOrder对tupleList进行排序。

我可以使用两个嵌套的for循环来解决这个问题,但需要一个更有效的解决方案。

#First sort according to the color order
    for aColor in colorOrder:
        for aTuple in tupleList:
            if aTuple[1] == aColor:
                ResultList.append(aTuple)
#Second add the tuples to the ResultList, whose color is not in the colorOrder
    for aTuple in tupleList:
        if aTuple[1] not in colorOrder:
            ResultList.append(aTuple)

2 个答案:

答案 0 :(得分:5)

首先,我要colorOrder进行映射:

colorMap = {c: i for i, c in enumerate(colorOrder)}

现在使用colorMap.get

可以更轻松地进行排序
sorted(tupleList, key=lambda tup: colorMap.get(tup[1], -1))

这会使事情不在地图。如果你宁愿添加最后,只需使用一个非常大的数字:

sorted(tupleList, key=lambda tup: colorMap.get(tup[1], float('inf')))

答案 1 :(得分:0)

检查此解决方案:

     xx = dict([(x[1],x[0]) for x in enumerate(colorOrder)])
     [x[1] for x in sorted([(xx.get(y[1],999),y) for y in tupleList])]