有一个带有值的字符串(字符串) - 名称和数字的(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'..
我错过了什么?
答案 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)
将实现同样的目的。
此外,您的代码的一些一般性评论与问题没有直接关系:
;
结束每一行,并且惯例就是省略它,即使它是允许的 dctUnits
似乎已经是一个字典;我不清楚你的to_dict
函数应该做什么(我读它的方式,你应该早点得到一个不同的错误),但它似乎完全不需要。