Python 仅对列表中的列表字典值进行排序
我有这种口述Python 仅对列表中的列表字典值进行排序,python,list,sorting,dictionary,Python,List,Sorting,Dictionary,我有这种口述 dict2 = {'value1': [ 2, ['get1', 3], ['post3', 4] ], 'value2' : [1, ['get1', 2], ['post2', 5] ], 'value3' : [7, ['get17', 6], ['post2', 2], ['post3', 3] ] } 我知道如何根据列表中的第一个值(7、2、1)对其进行排序。但是,一旦我按第一个值对象对它进行了排序,我只想根据每个列表中的第二个值对列表进行排序 比如像这样, 'valu
dict2 = {'value1': [ 2, ['get1', 3], ['post3', 4] ], 'value2' : [1, ['get1', 2], ['post2', 5] ], 'value3' : [7, ['get17', 6], ['post2', 2], ['post3', 3] ] }
我知道如何根据列表中的第一个值(7、2、1)对其进行排序。但是,一旦我按第一个值对象对它进行了排序,我只想根据每个列表中的第二个值对列表进行排序
比如像这样,
'value3' : [7, ['get17', 6], ['post3', 3], ['post2', 2] ],
'value1': [ 2, ['post3', 4], ['get1', 3] ],
'value2' : [1, ['post2', 5], ['get1', 2] ]
我一直在研究像itemgetter这样的东西,但没弄明白。这在python中是可能的吗
编辑:
这就是我如何排序第一个要打印的值对象
for key, value in sorted(dict2.iteritems(), key=lambda (k,v): (v,k), reverse=True):
print key, value
投入变量
sort1 = sorted(dict2.items(), key=operator.itemgetter(1, 1), reverse=True)
既然您已经知道如何根据dict中的第一个值进行排序,那么让我们重点关注内部序列的排序。重要的一步是使用切片来修剪初始值,以便可以对剩余的对进行排序:
>>> for key, seq in dict2.items():
dict2[key] = seq[:1] + sorted(seq[1:], key=itemgetter(1), reverse=True)
>>> pprint(dict2)
{'value1': [2, ['post3', 4], ['get1', 3]],
'value2': [1, ['post2', 5], ['get1', 2]],
'value3': [7, ['get17', 6], ['post3', 3], ['post2', 2]]}
您应该考虑将这些项作为列表或元组,并用一个函数或lambda表达式排序它们,如:
items = dict2.items()
items.sort(key=lambda x:x[1][0])
回答得很好,您能详细说明一下
lambda x,y:y[1][0]-x[1][0]
的工作原理吗?lambda
表达式本质上是临时函数sort
可以使用比较器,我使用的函数指针就是lambda表达式。如果xy
,则比较器应返回-1
,如果x==y
,则比较器应返回0
y[1][0]
是元组的第一个元素(即列表),是列表的第0个元素(第一个数字)。如果你想读更多,请看以下几页:这太棒了。但我意识到我最初为第一个值对象排序的方式与此相冲突。请看我的编辑,在一个例子中,我只是打印,在另一个例子中,它会生成一个元组输出,我无法使用上述解决方案。我可以如何实现您给出的解决方案,但首先是第一个值,同时保持字典格式(这样我就可以按值列表排序)吗?