我的字典看起来像这样:
d1= {'a':[1, 5], 'b':[2, 23], 'c':[99,12]}
在字典有两个值的列表之前,我可以这样排序:
for key in sorted(mydict, key=mydict.get, reverse=True):
print key.rstrip() + " : " + str(mydict[key])
这实际上仍然适用于列表中的第一个值,但它不会对第二个值执行任何操作:
c : [99, 12]
b : [2, 23]
a : [1, 5]
如何按列表中的第二个值进行排序?如果我选择的话,如何按第二个值排序第一个值,反之亦然?
答案 0 :(得分:2)
实际上,它使用第二个值执行某些操作:如果第一个值相等,则将其用作 tie-breaker 。
尽管如此,您只需将lambda
表达式用作key
:
for key in sorted(mydict, key=lambda x: (mydict.get(x)[1],mydict.get(x)[0]), reverse=True): print key.rstrip() + " : " + str(mydict[key])
这里发生的是你如何对值进行排序作为“关键”,通过调用mydict.get(x)
来获取值,现在你可以构造一个新的元组(mydict.get(x)[1],mydict.get(x)[0])
,其中放置第二个元素第一个和第一个元素作为第二个元素。
由于元组按字典顺序排序,这意味着Python将首先在第一个元素上进行比较,如果是第二个元素,则进行比较。现在,因为我们交换了这些地方,所以它首先要比较第二个,然后是第一个。
然而,正如@ Jean-FrançoisFabre所说,你可以使用[::-1]
反转保存.get
操作的元组(结果看起来更优雅),所以:< / p>
for key in sorted(mydict, key=lambda x: mydict.get(x)[::-1], reverse=True): print key.rstrip() + " : " + str(mydict[key])
但请注意,更优雅的方法是立即对键值元组进行排序:
for key,value in sorted(mydict.items(), key=lambda x:x[1][::-1], reverse=True): print key.rstrip() + " : " + str(value)
答案 1 :(得分:0)
所以这个问题很旧,但这可能对某人有帮助。免责声明:我不了解python,所以我将以非常广泛的术语来描述它,这可能是可能的,也可能不是。我已经在C#中做到了。
如果您需要对项目进行一次排序,请使用Willern的很好的答案。如果您一直需要对它们进行排序,请继续阅读。
我发现最方便的方法是制作一个新的集合对象,该对象将字典和列表混在一起。新的集合对象导出列表将拥有的所有方法,并通过向两个集合中添加内容来处理添加等。构造函数使用了一个lambda来从值中获取键,以便可以填充字典。该集合还导出了字典用于读取的所有方法(但显而易见的原因不是用于写入的方法),以便快速查找关键字。此外,还有一个AddRange方法,因此插入不会是O(N ^ 2)。 AddRange会将所有项目附加到列表中并调用sort。
如何按某种东西进行排序的扩展应该很明显。