对于包含字典对象的列表,如何根据键的值过滤列表?

时间:2014-01-07 09:57:57

标签: python json list parsing dictionary

我正在将json个对象写入单独的日志文件和缓冲列表。我想只获取与z_msg键上的条件的键y_time对应的值列表。

以下是列表中的六个项目。如何制作过滤器,以便以y_time > 1389088007.123000

的四个项目的子列表结束

[{"prompt": "S75U>", "type": "tracelog", "y_time": 1389088007.122344, "z_msg": "\nS75U>\n"}, {"prompt": "S45U>", "type": "about", "y_time": 1389088007.122945, "z_msg": "S45U>about -b\n"}, {"prompt": "S75U>", "type": "tracelog", "y_time": 1389088007.123140, "z_msg": "\nS75U>\n"}, {"prompt": "S45U>", "type": "about", "y_time": 1389088007.123441, "z_msg": "S45U>about -b\n"}, {"prompt": "S75U>", "type": "tracelog", "y_time": 1389088007.123842, "z_msg": "\nS75U>\n"}, {"prompt": "S45U>", "type": "about", "y_time": 1389088007.124541, "z_msg": "S45U>about -b\n"}]

2 个答案:

答案 0 :(得分:2)

您可以按y_time键对列表进行排序,然后将前30个切片:

top_30 = my_list.sort(key=lambda x: x['y_time'], reverse=True)[:30]

答案 1 :(得分:2)

您可以按照Daniel的建议进行排序,也可以使用heapq.nlargest

from heapq import nlargest
top_30 = nlargest(30, my_list, key=lambda x: x['y_time'])

对于小型列表,由于更优化的实现,排序可能更快。对于大型列表,由于更好的算法复杂性,您可能会从heapq中获得性能优势(O(N)如果N合理地大于M vs O(NlogN) 1功能)。找到盈亏平衡点(如果有的话)将是timeit的工作。

当然,在任何一种情况下,如果您只想要一个z_msg元素的列表,您可以使用简单的列表理解对top_30进行后处理:

z_msg = [item['z_msg'] for item in top_30]

1 Nmy_list中元素的数量,您正在寻找顶级M元素