2014-10-06 101 views
4

給定一個列表(例如,[1,1,2,1,2,2,3]),它不是從最高到最低排序,並且包含所有數字的倍數,I需要以最小值交換最大值,第二個最大值與第二個分鐘等。因此,我們的示例列表將變爲[3,3,2,3,2,2,1]。另外,爲了澄清,它不只是最大值和最小值,而是最大值和最小值的每一層。所以如果最大值爲4,1和4應該切換爲2和3。交換列表中的最大值和最小值

我發現這個問題的題目How to swap maximums with the minimums? (python)

但考慮到代碼示例顯得冗長,假設有在名單沒有重複。有沒有更好的方法來做到這一點?這似乎是一個簡單的事情。

+0

爲什麼會有不同數量的輸入和輸出的每個整數?它似乎只是'[4 - x for src]',而不是保留實際值。 – user2864740 2014-10-06 02:12:48

+0

也許你可以澄清在[[1,1,8,9])的情況下應該發生什麼 - - 結果應該是「[9,9,8,1]」還是「[9,9,2,1 ]'?我在回答中假設前者,但其他一些答案則假設後者。 – 2014-10-06 02:16:11

+0

就像你說的那樣。 8保持不變,因爲它在最大/最小的層數方面是中等的。 – Caleb 2014-10-06 02:42:41

回答

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] 
+1

如何提取'sa = sorted(set(a))'並使用'dict(zip(sa,reversed(sa)))' – 2014-10-06 02:50:35

+0

當然,這也可以。 – 2014-10-06 19:29:03