python字典列表根据指定元素取值

l = [{'id':13,'title':'2222','rank':1},{'id':25,'title':'33fff','rank':2},{'id':53,'title':'hhhh','rank':3},{'id':73,'title':'ffff','rank':4},{'id':23,'title':'kkkkk','rank':5}]

这个列表是根据rank排序的,现在我想根据指定的id获取前一个和后一个对象
比如,id=73时,获取到{'id':53,'title':'hhhh','rank':3}和{'id':23,'title':'kkkkk','rank':5}

id=13时,获取到{'id':25,'title':'33fff','rank':2}

阅读 7.5k
2 个回答
# encoding=utf-8

l = [{'id': 13, 'title': '2222', 'rank': 1}, {'id': 25, 'title': '33fff', 'rank': 2}, {'id': 53, 'title': 'hhhh', 'rank': 3}, {'id': 73, 'title': 'ffff', 'rank': 4}, {'id': 23, 'title': 'kkkkk', 'rank': 5}]


def get_By_Id(id):
    l_a = []
    for i in xrange(len(l)):
        if l[i]['id'] == id:
            if(i > 0):
                l_a.append(l[i-1])
            if(i < len(l)-1):
                l_a.append(l[i+1])
    return l_a

x = get_By_Id(23)
print x

先建立 id 与所需值的字典关系:

In [9]: l = [{'id':13,'title':'2222','rank':1},{'id':25,'title':'33fff','rank':2},{'id':53,'title':'hhhh','rank':3},{'id':73,'title':'ffff','rank':4},{'id':23,'title':'kkkkk','rank':5}]

In [10]: d = [a['id'] for a in l]

In [11]: s = dict([(d[i], l[i]) for i in range(len(l))])

然后,一个简单的函数就可以调取前后值了:

In [12]: def func(num):
   ....:     n = d.index(num)
   ....:     if n == 0:
   ....:         return s[d[n+1]]
   ....:     elif n == len(d)-1:
                 return s[d[n-1]]
             else:
   ....:         return s[d[n+1]], s[d[n-1]]
   ....:

最终运行结果:

In [24]: func(73)
Out[24]:
({'id': 23, 'rank': 5, 'title': 'kkkkk'},
 {'id': 53, 'rank': 3, 'title': 'hhhh'})

In [25]: func(13)
Out[25]: {'id': 25, 'rank': 2, 'title': '33fff'}

这种方式,效率上相对高一些,一方面字典取值速度更快,另一方面每次寻址都只需要寻一层,且建立的序列和字典可以重复多次调用。
当然,还有一种更高效的方式,但必须导入 collections 模块,具体可以参考:
python 的有序字典

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题