2015-10-01 59 views
1

我有花車的列表:如何排序列表先寫相同的元素,然後 - 按升序

inputlist = [4.1, 8.2, 2.1, 8.1, 3.1] 

我需要它是:

list_sorted = [8.1, 8.2, 2.1, 3.1, 4.1] 

通過先寫彩車其中的int(數字)是相同的(int(8.1)== int(8.2)),按升序排列,然後是其他元素,也是按升序排列。

又如:

inputlist = [9.3, 4.1, 4.2, 9.4, 8.2, 7.1] 
list_sorted = [4.1, 4.2, 9.3, 9.4, 7.1, 8.2] 
+0

這是一個非常隨意的命令;你有沒有嘗試過自己呢? –

+0

「排序()」不適合你的情況? – ozgur

+0

不是。我已經寫了一個撲克挑戰賽程序,未經證實的假設是我可以用這種方式對列表進行排序。這是現在唯一缺少的一件。 – Riddle00

回答

2

你需要做兩遍:一次計數的整數部分,然後進行排序:

from collections import Counter 

integer_counts = Counter(int(num) for num in inputlist) 
list_sorted = sorted(inputlist, key=lambda n: (integer_counts[int(n)] == 1, n)) 

排序關鍵字生成一個密鑰與布爾第一個(False爲1以上的整數值,True爲1),實際值第二。這個基團與整數部分中發生一次以上第一那些值:

>>> from collections import Counter 
>>> inputlist = [4.1, 8.2, 2.1, 8.1, 3.1] 
>>> integer_counts = Counter(int(num) for num in inputlist) 
>>> sorted(inputlist, key=lambda n: (integer_counts[int(n)] == 1, n)) 
[8.1, 8.2, 2.1, 3.1, 4.1] 
>>> inputlist = [9.3, 4.1, 4.2, 9.4, 8.2, 7.1] 
>>> integer_counts = Counter(int(num) for num in inputlist) 
>>> sorted(inputlist, key=lambda n: (integer_counts[int(n)] == 1, n)) 
[4.1, 4.2, 9.3, 9.4, 7.1, 8.2] 

算法複雜仍然是O(NlogN);計數是一個O(N)步,然後是一個O(NlogN)排序,使整個進程O(NlogN)。

1

這會有什麼價值嗎?

inputlist = [4.1, 8.2, 2.1, 8.1, 3.1] 
def srt (lst): 
    chkdict = {} 
    for x in lst: 
     y = int(x) 
     if not y in chkdict: chkdict[y] = [x] 
     else: chkdict[y].append(x) 
    left = []; right = [] 
    for x in chkdict.values(): 
     if len(x)>1: left += x 
     else: right += x 
    left.sort(); right.sort() 
    return left+right 


>>> ["%.1f" % x for x in srt(inputlist)] 
['8.1', '8.2', '2.1', '3.1', '4.1'] 

注:我用字符串格式化來強制更好看。

這不是最有效的方法,但它對中小型列表工作正常。它使用一些與collections.Counter()中相同的機制。

相關問題