A question was asked here on SO在几分钟前介绍了如何根据字典键的值对其进行排序。
我几天前刚刚读到operator.itemgetter
排序方法,并决定尝试一下,但它似乎不起作用。
并不是说我对问题的答案有任何问题,我只是想用operator.itemgetter
来试一试。
所以结论是:
>>> mydict = { 'a1': ['g',6],
'a2': ['e',2],
'a3': ['h',3],
'a4': ['s',2],
'a5': ['j',9],
'a6': ['y',7] }
我试过这个:
>>> l = sorted(mydict.itervalues(), key=operator.itemgetter(1))
>>> l
[['e', 2], ['s', 2], ['h', 3], ['g', 6], ['y', 7], ['j', 9]]
这就是我想要的效果。但是,由于我没有完整的字典(mydict.itervalues()
),我尝试了一下:
>>> complete = sorted(mydict.iteritems(), key=operator.itemgetter(2))
这不起作用(正如我所期望的那样)。
那么如何使用operator.itemgetter
对字典进行排序,并对嵌套的键值对调用itemgetter
呢?
发布于 2011-01-14 19:17:38
答案是--您不能。operator.itemgetter(i)
返回一个返回其参数的项i
的可调用对象,即
f = operator.itemgetter(i)
f(d) == d[i]
它再也不会像d[i][j]
那样返回了。如果您真的想以纯函数风格完成此操作,您可以编写自己的compose()
函数:
def compose(f, g):
return lambda *args: f(g(*args))
并使用
sorted(mydict.iteritems(), key=compose(operator.itemgetter(1),
operator.itemgetter(1)))
请注意,我并不建议这样做:)
发布于 2011-01-14 19:23:09
itemgetter不支持嵌套(尽管attrgetter支持)
你需要像这样把球压平。
sorted(([k]+v for k,v in mydict.iteritems()), key=itemgetter(2))
发布于 2018-12-06 12:22:56
通常情况下,像kv[1][1]
一样索引速度更快:
>>> from timeit import timeit
>>> setup = 'import operator; g = operator.itemgetter(1); '
>>> setup += 'd = {i: list(range(i+2)) for i in range(100)}'
>>> kwargs = {'setup': setup, 'number': 10000}
>>> timeit('sorted(d.items(), key=lambda kv: kv[1][1])', **kwargs)
0.5251589557155967
>>> timeit('sorted(d.items(), key=lambda kv: g(kv[1]))', **kwargs)
0.7175205536186695
>>> timeit('sorted(d.items(), key=lambda kv: g(kv)[1])', **kwargs)
0.7915238151326776
>>> timeit('sorted(d.items(), key=lambda kv: g(g(kv)))', **kwargs)
0.9781978335231543
https://stackoverflow.com/questions/4690416
复制相似问题