2013-05-20 226 views
-1

使用值(字符串) - 名稱和數字(int)的字典。在python中按字母排序字母表中的字母

我希望字典按名稱排序。

有:

sorted(dictList, key = lambda (k,v): v['name']) 

,但得到 - 「字符串指數必須intergers,不STR」。

def to_dict(lstData) : 
    dct = dict(); 
    for dctData in lstData : 
     dct[dctData['id']] = dctData['name']; 
    return dct; 


Units = to_dict(db.getUnits()); 
sorted(Units, key = lambda k: Units[k]['name']); 

如果我RUN- 排序(dctunits,鍵=拉姆達X:X [1])

我得到:'long' object is unsubscriptable

它對錯誤的值進行排序。 在(X = 1L)

builtin sorted = <built-in function sorted>, 
global dctUnits = {1L: 'kg', 2L: 'day', 3L: 'week', 
    4L: 'month', 5L: 'g/L', 6L: 'ug/dL', 7L: 'ng/mL', 
    8L: 'year', 9L: 'min/day', 10L: 'cm', ...}, 
key undefined, 
x = 1L 

X應該是 '公斤' ..

那是什麼,我缺的是?

+3

向我們展示你的數據結構,你說這是一個字典,但你稱之爲'dictList' – jamylak

+0

所以你想按他們的名字排序一個字典列表? – Marcus

+3

顯示您的測試數據 –

回答

3

您正在做錯Lambda,您可以對字典鍵或其值進行排序,也可以按鍵值對進行排序。

(假設dict是你的詞典)

通過按鍵:

sorted(dict.keys(), key=lambda k: dict[k]['name']) 
# will return a list of the keys, sorted by the value of 'name' 

通過值:

sorted(dict.values(), key=lambda v: v['name']) 
# will return a list of the values, sorted by the value of 'name' 

通過對:

sorted(dict.items(), key=lambda (k, v): v['name']) 
# will return a list of the key value pairs, sorted by the value of 'name' 
+0

'dictList'必須已經包含'dict.items()'的結果,否則這個異常就是'ValueError':需要多個值才能解包。 – lvc

+2

這是行不通的,因爲'dictList'顯然不是字典(看錯誤信息) – jamylak

+0

@jamylak我有一種感覺,OP因爲他們是新手而簡單地命名他們的字典「dictList」。 + lvc或dictList有2個項目,在這種情況下,第二個項目(v)是一個關鍵字,他正在使用字符串索引訪問它?沒有更多的代碼,它是不確定的。 –

0

運行你的代碼提供給我原來的錯誤,而不是新的錯誤。有幾件事情需要注意,爲什麼它這樣做 - 第一,有什麼錯誤是告訴你的是,部分字符串被訪問嚴格是這樣的:

>>> 'abc'[1] 
'b' 

,而不是這樣:

>>> 'abc'['b'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: string indices must be integers, not str 

它試圖這樣做的原因是因爲當你在你的關鍵功能做:

Units[k]['name'] 

Units[k]解析爲Units[1L],其解析爲字符串'kg'。您不能要求該字符串的['name'],因爲這對字符串沒有意義。也許你想要做的是按值排序(即使你沒有告訴Python它是什麼),在這種情況下,你想要的東西類似於:

>>> sorted(Units, key=lambda k: Units[k]) 
[10L, 2L, 5L, 1L, 9L, 4L, 7L, 6L, 3L, 8L] 

你可以通過意識到字典已經有一個方法來做到這一點,從而避免了lambda - sorted(Units, key=Units.get)將實現同樣的事情。

另外,在你的代碼一些一般性的評論是沒有直接關係的問題:

  • Python不要求你結束與;每一行,並約定是,你忽略它,即使它允許
  • 的「L」在所有的數字到底是同樣無操作(有效 - 它改變的東西你不需要關心),並在Python 3
  • 禁止您的dctUnits似乎已經是字典;我不能完全知道你的功能是什麼意思(我閱讀它的方式,你應該早晚得到一個不同的錯誤),但它似乎完全不需要。
+0

應該如何排序列表/字典... 現在我試圖在我的to_dict函數中對LstData進行排序。 在那裏我有一個列表中的對象單元...但它似乎不工作。 任何想法? – kingRauk

+0

@kingRauk就像用適當的按鍵功能調用'sorted'一樣簡單(如果你不想自然排序)。你的問題完全是你的關鍵功能沒有達到你所期望的。 – lvc

+0

但什麼是合適的按鍵功能?已經嘗試過所有的谷歌現在...無望。缺少C#:-( – kingRauk