我有两个列表,第一个列表是键盘顺序,第二个列表是元组列表。
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)
答案 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])]