2014-04-09 137 views
1

我有760個文件的列表,從中提取我2行的數據,然後將其存儲在字典的列表:Python3:排序字典鍵

output = {'file number':data, '1':somedatain1, '2':somedatain2, ... '760':somedatain760}

N.B. 這些數字是字符串,因爲它們是通過執行os.listdir('。')獲得的,以便獲取文件名列表並將字符串拆分。 [如果需要的話我可以轉換到這一點的整數(using int())]

然後將字典被打印通過創建密鑰的列表,並進行迭代:

keys = output.keys() 
for x in keys: 
    print(x, '\t', output[x]) 

但是輸出是按隨機順序[因爲字典的無序性,我相信它是一種固有屬性 - 儘管我不知道這是爲什麼),如果輸出按文件編號按數字順序排列,它會更加方便。因此,這引發了一個問題:

鑑於我的鑰匙的名單要麼

1. keys = ['filename', '2', '555', '764' ... '10']

或者,如果我的文件號的字符串更改爲整型:

2. keys = ['filename', 2, 555, 764 ... 10]

我怎麼排序我的根據:鍵列表o文件編號的數字值,如果它是字符串的(如上面的1.所示),或者如果它是混合對象類型的話。 1個字符串和760個整數,如上面2所示)?然而

sorted(output, key=lambda k: int(k) if k.isdigit() else float('-inf')) 

這將數字排序字符串:

+1

首先,你必須定義如何比較' '文件名'<2'工作。 – roippi

+0

關於字典排序是任意的,請參閱:[爲什麼Python字典的順序是任意的?](http://stackoverflow.com/q/15479928) –

回答

3

,您可以給sorted()功能的關鍵。請注意,不需要撥打dict.keys();迭代字典已經產生了一系列的鍵,直接在字典上調用sorted()

與數字相比,Python 3沒有爲字符串定義排序,因此對於任何不是數字的鍵,將返回float('-inf')(負無窮),而不是將這些鍵放在排序的開頭。

演示:

>>> sorted(keys, key=lambda k: int(k) if k.isdigit() else float('-inf')) 
['filename', '2', '10', '555', '764']