【问题标题】:For a list containing dictionary objects, how do I filter the list based on the value of a key? [closed]对于包含字典对象的列表,如何根据键的值过滤列表? [关闭]
【发布时间】:2014-01-07 09:57:56
【问题描述】:

我正在将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"}]

【问题讨论】:

  • 我重新表述了一下,希望现在更清楚了。

标签: python json list parsing dictionary


【解决方案1】:

您可以按照丹尼尔的建议进行排序,也可以使用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]

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

【讨论】:

  • 感谢您的快速回答。很高兴知道,但我最初问错了问题。请检查已编辑的问题。
  • @PaulH -- 您可以使用简单的列表理解进行过滤:[x for x in my_list if x['y_time'] > 1389088007.123]
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2020-07-17
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多