几分钟前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元组-并将其解压缩为k
和v
。因此,当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/