几分钟前A question was asked here on SO,根据字典键的值对字典键进行排序。

我刚读了几天的sort的operator.itemgetter方法,并决定尝试这种方法,但是它似乎没有用。

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

因此,dict是:

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

key参数始终是一次从iterable(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]),它在['e',2]中“itemgets”第二项,即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/

10-10 12:46