【问题标题】:Convert a nested Dictionary to a nested List with List Comprehension method in Python在 Python 中使用 List Comprehension 方法将嵌套字典转换为嵌套列表
【发布时间】:2023-04-09 23:03:02
【问题描述】:

我想使用 List Comprehension 方法将以下嵌套字典转换为列表的嵌套列表以获得更好的性能:

n = {
"ETHBTC": {
    "2021-09-04 01:55:00": {
        "open": 0.078998,
        "close": 0.079007,
        "volume": 44.952200000000005
    },
     "2021-09-04 01:56:00": {
        "open": 0.079005,
        "close": 0.078959,
        "volume": 68.62790000000001
    },
    "2021-09-04 01:57:01": {
        "open": 0.07896,
        "close": 0.078962,
        "volume": 131.6615000000001
    },
    "2021-09-04 01:58:00": {
        "open": 0.078966,
        "close": 0.078988,
        "volume": 157.38520000000005
    }
}
   "BTCUSDT": {
    "2021-09-04 01:55:00": {
        "open": 49730.55,
        "close": 49710.01,
        "volume": 28.57857999999999
    },
    "2021-09-04 01:56:00": {
        "open": 49710.0,
        "close": 49681.35,
        "volume": 19.088980000000017
    },
    "2021-09-04 01:57:00": {
        "open": 49681.36,
        "close": 49737.05,
        "volume": 20.885500000000008
    },
    "2021-09-04 01:58:00": {
        "open": 49737.06,
        "close": 49757.33,
        "volume": 35.782369999999965
    }
}

预期输出与“关闭”值一起说,我试图在一个内衬代码中执行此操作以提高效率:

result = ["ETHBTC"[0.079007, 0.078959, 0.078962, 0.078988],
          "BTCUSDT"[49710.01, 49681.35, 49737.05, 49757.33]]
 

【问题讨论】:

  • 您能告诉我们您已经尝试过什么吗?另外,效率是什么意思?单行并不总是最有效的,无论是在性能还是可读性方面。
  • 这样做的目的是什么?我不明白为什么你不能只使用字典
  • 效率是指更好的性能。据我了解,列表理解比 for 循环更好。我想在将其转换为列表后计算移动平均线。
  • @ScrappyCoco 是的,但实际上不是。老实说,这取决于,如果你问这类问题,那么你需要重新考虑你在 python 中的技术或你的数据模型。在你拥有一个正常运行的产品之前,不要担心 python 的效率。如果你想要这种规模的效率,那么我认为 python 可能不是首选语言。

标签: python dictionary list-comprehension


【解决方案1】:

仅仅因为屏幕上的代码更少并不意味着它更高效。此外,如果向下转换数据意味着丢失有意义的数据,那么它对于宏伟的计划是多余的。此外,python 不是从效率开始,而是从功能开始。之后,您可以重新审视和改进瓶颈/等等...

也就是说,我可以看到这样做的必要性,是的,最有效和最易读的方法之一可能是单行 sn-p 代码。请参考The Zen of Python,因为它指的是我刚才所说的。

但为什么是列表?哈希表/查找不是比唯一键字典的列表更有效吗?


最后,我想告诉您实现预期输出的正确方法。但是请考虑我上面的想法。

>>> {k: [d['close'] for d in v.values()] for k, v in n.items()}
{"ETHBTC": [0.079007, 0.078959, 0.078962, 0.078988],
 "BTCUSDT": [49710.01, 49681.35, 49737.05, 49757.33]}

如果你必须有一个dict的列表,你可以很容易地修改上面的代码来达到想要的结果:

>>> [{k: [d['close'] for d in v.values()]} for k, v in n.items()]
[{"ETHBTC": [0.079007, 0.078959, 0.078962, 0.078988]},
 {"BTCUSDT": [49710.01, 49681.35, 49737.05, 49757.33]}]

仅供参考在向某人(尤其是本网站)提出问题之前,您应该尝试自己或尝试找到答案。

【讨论】:

  • 感谢您的回答。我将此代码与我的算法交易设置一起使用。我的函数需要一个列表来计算我需要将其转换为列表的移动平均值。我知道 python 很慢,但我别无选择。目前我的函数使用 numba 你有什么其他的加速建议吗?
  • 使用 numpy/numba/pandas/dask/... 将是一个开始。他们将繁重的工作从 python 中移开,并依靠 c 或其他性能更高的语言为您完成繁重的工作。
猜你喜欢
  • 2020-09-03
  • 2022-12-05
  • 2023-03-11
  • 2020-05-16
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
相关资源
最近更新 更多