【问题标题】:Removing nested list in a dictionary删除字典中的嵌套列表
【发布时间】:2021-12-08 18:57:49
【问题描述】:

这是我的输入数据。

data = {323: [[639, 646]], 325: [[1491, 1507]], 332: [[639, 647], [823, 833], [1274, 1298]], 334: [[640, 646]], 335: [[822, 834]]}

我想删除值小于或等于10的子列表。

我的输出应该是这样的。

output_data = {323: [], 325:[[1491,1507]], 332:[[1274,1298]], 334:[], 335:[[822,834]]}

我怎样才能达到想要的输出?

【问题讨论】:

  • 你能澄清一下上面的要求吗? “其值小于或等于 10” - 我注意到情况并非如此。
  • 值是指列表子列表中的元素 (639,646)、(1491,1507)... 等等。
  • 我认为条件是值差异小于或等于10。
  • 是的,我也指那些。但是比如我不明白639是怎么小于等于10的。
  • 我想计算这些元素的差异。如果差值

标签: python-3.x list dictionary list-comprehension dictionary-comprehension


【解决方案1】:

您可以编写一个列表推导式,为字典中的每个键重新构建列表列表,条件是内部项目的差异大于 10:

for key, values in data.items():
    data[key] = [[low, high] for low, high in values if high - low > 10]

【讨论】:

    【解决方案2】:

    我刚刚做了一个快速测试,看起来可以使用 dict 理解和 filter buitin 函数来做到这一点:

    result = {k: list(filter(lambda v: v[1] - v[0] > 10, val_list))
              for k, val_list in data.items()}
    
    print(result)
    

    输出:

    {323: [], 325: [[1491, 1507]], 332: [[1274, 1298]], 334: [], 335: [[822, 834]]}
    

    假设: 子列表首先从最低的元素排序,然后是更高的元素。如果没有,您需要使用abs 调用来包装它,例如abs(v[1] - v[0]) 以确保安全,以防v[0] 是更高的元素。

    【讨论】:

    • 等等……这个解决方案在某些情况下实际上是不对的。
    • 例如,如果您将 332 中的 [1274, 1298] 移动到第一位,则会导致子列表为空。
    • @TaarunSrinivas 我已经更新了答案,现在在这些情况下它也应该给出正确的结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 2019-06-04
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多