首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用operator.itemgetter对字典进行排序

使用operator.itemgetter对字典进行排序
EN

Stack Overflow用户
提问于 2011-01-14 19:11:25
回答 4查看 39.2K关注 0票数 19

A question was asked here on SO在几分钟前介绍了如何根据字典键的值对其进行排序。

我几天前刚刚读到operator.itemgetter排序方法,并决定尝试一下,但它似乎不起作用。

并不是说我对问题的答案有任何问题,我只是想用operator.itemgetter来试一试。

所以结论是:

代码语言:javascript
复制
>>> mydict = { 'a1': ['g',6],
           'a2': ['e',2],
           'a3': ['h',3],
           'a4': ['s',2],
           'a5': ['j',9],
           'a6': ['y',7] }

我试过这个:

代码语言:javascript
复制
>>> l = sorted(mydict.itervalues(), key=operator.itemgetter(1))
>>> l
[['e', 2], ['s', 2], ['h', 3], ['g', 6], ['y', 7], ['j', 9]]

这就是我想要的效果。但是,由于我没有完整的字典(mydict.itervalues()),我尝试了一下:

代码语言:javascript
复制
>>> complete = sorted(mydict.iteritems(), key=operator.itemgetter(2))

这不起作用(正如我所期望的那样)。

那么如何使用operator.itemgetter对字典进行排序,并对嵌套的键值对调用itemgetter呢?

EN

回答 4

Stack Overflow用户

发布于 2011-01-14 19:17:38

答案是--您不能。operator.itemgetter(i)返回一个返回其参数的项i的可调用对象,即

代码语言:javascript
复制
f = operator.itemgetter(i)
f(d) == d[i]

它再也不会像d[i][j]那样返回了。如果您真的想以纯函数风格完成此操作,您可以编写自己的compose()函数:

代码语言:javascript
复制
def compose(f, g):
    return lambda *args: f(g(*args))

并使用

代码语言:javascript
复制
sorted(mydict.iteritems(), key=compose(operator.itemgetter(1),
                                       operator.itemgetter(1)))

请注意,我并不建议这样做:)

票数 7
EN

Stack Overflow用户

发布于 2011-01-14 19:23:09

itemgetter不支持嵌套(尽管attrgetter支持)

你需要像这样把球压平。

代码语言:javascript
复制
sorted(([k]+v for k,v in mydict.iteritems()), key=itemgetter(2))
票数 5
EN

Stack Overflow用户

发布于 2018-12-06 12:22:56

通常情况下,像kv[1][1]一样索引速度更快:

代码语言:javascript
复制
>>> 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4690416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档