在Python中按值排序嵌套字典,余下部分按另一个值排序
考虑一下这个字典的格式。
{'KEY1':{'name':'google','date':20100701,'downloads':0},
'KEY2':{'name':'chrome','date':20071010,'downloads':0},
'KEY3':{'name':'python','date':20100710,'downloads':100}}
我想先按照下载次数对字典进行排序,然后再把没有下载的项目按日期排序。显然,字典本身是不能排序的,我只需要一个可以遍历的排序后的键的列表。
['KEY3','KEY1','KEY2']
我已经可以通过使用 sorted
来按某个值进行排序,但我该怎么同时按第二个值进行排序呢?
5 个回答
在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在另一个地方使用这些数据。这个过程就像是把水从一个水桶倒到另一个水桶里。
有些时候,我们会遇到一些问题,比如数据的格式不对,或者数据没有按照我们预期的方式出现。这就像是你想倒水,但水桶的口太小,水倒不进去,或者水桶里有杂物,导致水流不畅。
为了避免这些问题,我们可以使用一些工具和方法来确保数据能够顺利地从一个地方转移到另一个地方。这就像是使用漏斗来帮助我们把水倒得更顺利。
总之,处理数据就像是一个搬运工的工作,我们需要确保每一步都能顺利进行,才能把数据安全地送到目的地。
your_dict = dict(sorted(your_dict.items(), key = lambda x: (x[1]["downloads"], x[1]["date"])))
你可以给 sorted
函数传一个 key
函数,这个函数会返回一个包含你想要排序的两个东西的元组。假设你的大字典叫 d
:
def keyfunc(tup):
key, d = tup
return d["downloads"], d["date"]
items = sorted(d.items(), key = keyfunc)
如果你喜欢的话,也可以用 lambda
来实现,但这样写可能更清晰。下面是用 lambda
实现的等效代码:
items = sorted(d.items(), key = lambda tup: (tup[1]["downloads"], tup[1]["date"]))
顺便提一下,因为你提到想先按“下载量”排序,上面的两个例子是按照下载量从小到大排序的。不过,从上下文来看,你可能想要按下载量从大到小排序,这样的话你可以在你的 keyfunc
中这样写:
return -d["downloads"], d["date"]
如果你想要的效果是先按非零下载量从小到大排序,然后把所有下载量为零的记录放在后面,你可以这样写:
return (-d["downloads"] or sys.maxint), d["date"]
在使用 sorted()
函数时,可以用 key
参数。这个参数让你可以指定一个函数,这个函数会接收正在排序的实际项目,然后返回一个值,排序就是根据这个值来进行的。如果返回的值是一个元组(就是一组值),那么排序就会先看元组的第一个值,如果第一个值相同,再看第二个值。
sorted(your_list, key=lambda x: (your_dict[x]['downloads'], your_dict[x]['date']))