在python中按名称对字母表排序

时间:2013-05-20 07:46:15

标签: python

有一个带有值的字符串(字符串) - 名称和数字的(int)。

我希望dict按名称排序。

有:

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

但是得到 - “字符串索引必须是整数,而不是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']);

如果我跑 - 已排序(dctunits,key = lambda x:x [1])

我得到:'long' object is unsubscriptable

它正在按错误的值排序。 in(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应为'Kg'..

我错过了什么?

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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似乎已经是一个字典;我不清楚你的to_dict函数应该做什么(我读它的方式,你应该早点得到一个不同的错误),但它似乎完全不需要。