-1

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

我希望字典按名称排序。

有:

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']);

如果我运行- sorted(dctunits, key= lambda 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应该是'公斤'..

我错过了什么?

4

2 回答 2

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'
于 2013-05-20T07:55:20.583 回答
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函数是做什么的(按照我的阅读方式,你应该很快就会得到一个不同的错误),但它似乎完全不需要。
于 2013-05-20T09:05:16.660 回答