给定一个列表(例如,[1,1,2,1,2,2,3]),它没有从最高到最低排序,并且包含所有数字的倍数,我需要在适当的位置交换带有最小值的最大值,带有第二个分钟的第二个最大值等等。因此,我们的示例列表将变为[3,3,2,3,2,2,1]。
另外,只是为了澄清,它不仅仅是最大值和最小值,而是每一层的最大值和分钟数。因此,如果最大值为4,1和4应该切换为2和3。
我在这个主题上发现了这个问题:How to swap maximums with the minimums? (python)
但给出的代码示例似乎很冗长,并假设列表中没有重复项。真的没有更好的方法吗?这看起来很简单。
答案 0 :(得分:9)
这是一种方法,可能因为Python是一种表达语言:
>>> a = [1,1,2,1,2,2,3]
>>> d = dict(zip(sorted(set(a)), sorted(set(a), reverse=True)))
>>> [d[x] for x in a]
[3, 3, 2, 3, 2, 2, 1]