在做项目的时候,遇到这样的数据:
"trends": [
{
"name": "Rick Gates",
"promoted_content": null,
"query": "%22Rick+Gates%22",
"tweet_volume": 135732,
"url": "http://twitter.com/search?q=%22Rick+Gates%22"
},
{
"name": "#TheBachelorette",
"promoted_content": null,
"query": "%23TheBachelorette",
"tweet_volume": 91245,
"url": "http://twitter.com/search?q=%23TheBachelorette"
},
{
"name": "#KremlinAnnex",
"promoted_content": null,
"query": "%23KremlinAnnex",
"tweet_volume": 42654,
"url": "http://twitter.com/search?q=%23KremlinAnnex"
},
{
"name": "#LHHH",
"promoted_content": null,
"query": "%23LHHH",
"tweet_volume": 35252,
"url": "http://twitter.com/search?q=%23LHHH"
}]
我需要做的就是根据tweet_volume的数值对trends里的元素进行排序。
实现代码:
trends = sorted(trends,key = lambda e:e['tweet_volume'],reverse = True)
sotred()函数原型:
sorted(iterable[,key][,reverse])
iterable:需要排序的变量(必填)
key:指定排序的元素
reverse:指定是否逆序,默认为false
lambda:匿名函数,一般形式为
lambda arguments: expression
考虑到有些数据是NULL,因此需要提前做个处理,对于空的tweet_volume设置为0,完整代码:
for item in trends:
if(item['tweet_volume'] is None):
item['tweet_volume'] = 0
trends = sorted(trends,key = lambda e:e['tweet_volume'],reverse = True)
说明:我在dict中选择key的时候,选择的是e['tweet_volume']这样的索引方式,你也可以选择e.get('tweet_volume')或者e.__getitem__('tweet_volume')这样的方式去获取key的值。
trends = sorted(trends,key = lambda e:e.get('tweet_volume'),reverse = True))
trends = sorted(trends,key = lambda e:e.__getitem__('tweet_volume'),reverse = True))
更新:在Python文档中看到一种性能更高的方法
通过使用 operator
模块的 itemgetter
函数,可以非常容易的排序这样的数据结构
因此上面的程序可以改写成
from operator import itemgetter
trends = sorted(trends,key = itemgetter('tweet_volume'),reverse = True)