2013-12-13 226 views
0
dict = {'454133': 'PSJ', '420771': 'PSM', '403811': 'PSB', '434330': 'PSG', 
     '329745': 'PSG', '460192': 'PSC', '421534': 'PSA', '398614': 'PSM', 
     '398920': 'PSE', '403962': 'PSP', '331110': 'PSQ', '398436': 'PSP', 
     '306762': 'PSE', '403714': 'PSO', '460145': 'PSC', '398394': 'PST', 
     '451324': 'PSS', '255695': 'PSD', '237330': 'PSC', '398572': 'PSD', 
     '437653': 'PSR', '425822': 'PSI', '311786': 'PSS', '412713': 'PSK', 
     '460184': 'PSA', '328371': 'PSF', '344331': 'PSJ', '367531': 'PSR', 
     '109754': 'PS3', '404903': 'PSK', '402154': 'PSN', '399552': 'PSH', 
     '425861': 'PSL', '446234': 'PSF', '309296': 'PSO', '447616': 'PSH', 
     '151336': 'PSA', '306000': 'PSI', '404370': 'PSL', '103661': 'PS2', 
     '439822': 'PSN', '087265': 'PS1', '413635': 'PSB', '265040': 'PSQ', 
     '141005': 'PSB', '111111': 'PS10', '151515': 'PS20'} 

我想按值排序字典並按順序獲取鍵列表。 [A-Z] +中的值應該出現在頂部,並且[A-Z0-9] +中的值應該出現在最後。使用python使用字母數字值對字典中的值進行排序

結果應該是:

['141005', '151336', '237330', '255695', '265040', '306000', '306762', '309296', 
'311786', '328371', '329745', '331110', '344331', '367531', '398394', '398436', 
'398572', '398614', '398920', '399552', '402154', '403714', '403811', '403962', 
'404370', '404903', '412713', '413635', '420771', '421534', '425822', '425861', 
'434330', '437653', '439822', '446234', '447616', '451324', '454133', '460145', 
'460184', '460192', '087265', '103661', '109754', '111111', '151515'] 

我已經嘗試以下,但它總是首先給出了[A-Z0-9] +鍵和[A-Z] +鍵最後。

sorted_dict = sorted(dict.iteritems(), key=operator.itemgetter(1)) 
+1

我想知道你是怎麼得到 「應爲」 結果呢? – georg

+1

由於有人被要求每隔一小時左右說一次,所以沒有人做過,我猜這是輪到我了:不要叫你的字典「字典」或你的列表「列表」,等等。內置類型,他們很方便周圍。即使你知道得更好,也不會用真實的代碼去做,在例子中使用這些名字會讓人不得不提醒你,所以如果你不這樣做,它會節省時間。 :^) – DSM

回答

4
sorted_dict = sorted(
    dict.iteritems(), 
    key=lambda (_,value): tuple((not c.isalpha(), c) for c in value) 
) 

說明:字符由比較:

  1. 不管字符是字母字符,與字母來那些第一。
  2. 默認字典比較

然後才能得到最終結果,

map(operator.itemgetter(0), sorted_dict) 

不應'421534', '460184', '151336'(以某種順序)是第一?這些值是'PSA'的值。

編輯:你對什麼排序順序你想要什麼模糊(例如,哪個先出來的帽子先出'AB12C''AB2C'?)。

然而,這是另一種可能性:

def parts(s): 
    parts = [] 
    for part in re.split('(?=\\d)', s) 
     try: 
      parts.append(int(part)) 
     except ValueError: 
      parts.append(part) 

sorted_dict = sorted(dict.iteritmes(), key=lambda (_,value): parts(value))) 

這將使'PS3''PS20''AB2C''AB12C'之前。

+0

我不認爲這很有效,因爲OP似乎希望PS10和PS20最後一個,所以它在數字字符串中不是字典。我認爲使用keyfunc是浮動的許多自然類型之一。 – DSM

+0

@DSM,這使PS10和PS20最後。 –

+0

?我得到'sorted_dict'的最後四項是'('111111','PS10'),('103661','PS2'),('151515','PS20'),('109754','PS3 ')',這是有道理的,因爲你所做的一切都沒有按整數值排序。 – DSM

1

我有一種方式可以給你預期的結果。

我使用d作爲您的dict,因爲它是一個更好的標識符。

s = sorted([c for c in d.keys() if d[c].isalpha()]) + 
    sorted([c for c in d.keys() if not d[c].isalpha()]) 

似乎這是直接從您定義的規則構建。

這給s

['141005', '151336', '237330', '255695', '265040', '306000', '306762', '309296', '311786', '328371', '329745', '331110', '344331', '367531', '398394', '398436', '398572', '398614', '398920', '399552', '402154', '403714', '403811', '403962', '404370', '404903', '412713', '413635', '420771', '421534', '425822', '425861', '434330', '437653', '439822', '446234', '447616', '451324', '454133', '460145', '460184', '460192', '087265', '103661', '109754', '111111', '151515'] 
+0

我還需要字母和數字,進行排序。但它們被排序,它顯示隨機字母和隨機排序的數字。但所有的字母現在都在頂部,數字在最後。 – user3098561

+0

@ user3098561排序字母和數字是什麼意思?你想要另一個列表代表'dict'的值嗎? 'dict'本身是無序的,你只能得到一個有序的鍵列表。 – Ray

+0

是的,我想要的是頂部帶有字母的值。所以PSA,PSB,... PSZ,然後是數字PS1,PS2..PS10,PS11,... PS20。所以,在排序方式的頂部應該有2個列表字母,然後是按照PS1,PS2,PS10 **不按**,PS10,PS2,PS20等順序排序的數字。 – user3098561

相關問題