2017-06-26 80 views
2

我想問你如何正確排序詞典中的按鍵(整數),按升序排列,包括正數和負數。Python - 在一本詞典中對正數和負數進行排序

我有排序號碼(與下面的代碼排序)名單:

01.Key: 06 
02.Key: 07 
03.Key: 21 
04.Key: 59 
05.Key: -26 
06.Key: -17 
07.Key: -7 
08.Key: -6 

但我想在輸出這個排序列表:

01.Key: 06 
02.Key: 07 
03.Key: 21 
04.Key: 59 
05.Key: -6 
06.Key: -7 
07.Key: -17 
08.Key: -26 

目前我使用此代碼按升序對這些數字進行排序(至少對於正數):

sorted_html_output_dict = sorted(html_output_dict.items(), key=lambda x: (x[0] < 0, x), reverse=False) 

是否有任何ni這樣做使用lambda函數左右的方式嗎?

非常感謝您提前!

+1

我很困惑你想要的輸出。你說你想要一個清單......清單是否包含字符串「」?什麼決定了哪個鍵與什麼價值? (按鍵是按字典順序排列的?)同樣,輸入也很奇怪......你能粘貼一個實際的'dict'而不是冒號分隔的鍵/值對嗎? (如果這些值是數字,爲什麼有時候會出現前導零?這些值實際上是字符串嗎?) – smarx

回答

2

你快到了。

只需使用abs使排序元組中的第二項成爲絕對值即可。負來的積極因素後,他們都在遞減排序(絕對意義上的升序)順序:

sorted(html_output_dict.items(), key=lambda x: (x[0] < 0, abs(x[0]))) 

樣品:

>>> sorted([2, 1, 3, -4, -2,-6], key=lambda x: (x<0, abs(x))) 
[1, 2, 3, -2, -4, -6] 
+1

這就是我正在尋找的答案!我想過使用絕對函數來工作,但忘了試一試。非常感謝@Moses! –

+1

你確定這是你想要的嗎?它與您的問題中的輸出不匹配。 (這段代碼將使用-26保持05.Key,而您的輸出將05.Key與-6配對。也許您的示例輸出是錯誤的?) – smarx

+1

@PadrigoSantiago不客氣。很高興我能幫上忙。 –

1

假設我提出:

  1. 前導零隻是某種類型的拼寫錯誤,而這些值實際上是數字。
  2. 你想要一個新的dict作爲輸出,而不是list。 (您所描述的輸出在形式上與輸入類似,並且您似乎有一個dict作爲輸入。)
  3. 您想按鍵詞順序排序鍵以形成輸出字典的鍵/值對。

鑑於這些假設,我認爲這段代碼是做你想做的。這些值的排序方式與您之前所做的相似(儘管您錯過了abs)。這些按鍵按字典順序排序,然後這兩個組合成一個新的dict

import pprint 

d = { 
    "01.Key": 6, 
    "02.Key": 7, 
    "03.Key": 21, 
    "04.Key": 59, 
    "05.Key": -26, 
    "06.Key": -17, 
    "07.Key": -7, 
    "08.Key": -6, 
} 

d_sorted = { 
    k:v for k, v in zip(
     sorted(d.keys()), 
     sorted(d.values(), 
      key=lambda x: (x < 0, abs(x)) 
     ) 
    ) 
} 

pprint.pprint(d_sorted) 

# Output: 
# {'01.Key': 6, 
# '02.Key': 7, 
# '03.Key': 21, 
# '04.Key': 59, 
# '05.Key': -6, 
# '06.Key': -7, 
# '07.Key': -17, 
# '08.Key': -26} 
+0

這也是一個正確的答案。非常感謝你!我只需要這個功能: 'lambda x:(x <0,abs(x))' 對不起,在我的原始文章中混淆格式。 「01.鍵:」不是字典的實際內容/鍵,它只是在控制檯中打印出來以顯示所有的字典鍵(以及它們中有多少)。 06,07,21 ...都是鍵,每個鍵都指向它自己的html代碼(值)。 –

相關問題