gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:51:26 28 4
gpt4 key购买 nike

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

最佳答案

In [6]: sorted(mydict.iteritems(), key=lambda (k,v): operator.itemgetter(1)(v))
Out[6]:
[('a2', ['e', 2]),
('a4', ['s', 2]),
('a3', ['h', 3]),
('a1', ['g', 6]),
('a6', ['y', 7]),
('a5', ['j', 9])]

关键参数始终是一个函数,它一次从可迭代对象 (mydict.iteritems()) 中获取一项。在这种情况下,项目可能类似于

('a2',['e',2])

所以我们需要一个可以将 ('a2',['e',2]) 作为输入并返回 2 的函数。

lambda (k,v): ... 是一个匿名函数,它接受一个参数——一个 2 元组——并将其解包到 kv。因此,当 lambda 函数应用于我们的项目时,k 将是 'a2'v 将是 ['e',2]

lambda (k,v): operator.itemgetter(1)(v) 应用于我们的项目从而返回operator.itemgetter(1)(['e',2]),它“itemgets”在['e',2]中的第二个项目,即2。

请注意,lambda (k,v): operator.itemgetter(1)(v) 不是用 Python 编写代码的好方法。正如 gnibbler 指出的那样,operator.itemgetter(1) 会为每个项目重新计算。那是低效的。使用 operator.itemgetter(1) 的目的是创建一个可以多次应用的函数。您不想每次都重新创建函数。 lambda (k,v): v[1] 更易读,速度更快:

In [15]: %timeit sorted(mydict.iteritems(), key=lambda (k,v): v[1])
100000 loops, best of 3: 7.55 us per loop

In [16]: %timeit sorted(mydict.iteritems(), key=lambda (k,v): operator.itemgetter(1)(v))
100000 loops, best of 3: 11.2 us per loop

关于python - 使用 operator.itemgetter 对字典进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4690416/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com