我正在将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"}]
答案 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 N
是my_list
中元素的数量,您正在寻找顶级M
元素