2013-05-20 230 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