在 Python 中使用 List Comprehension 方法将嵌套 Dictionary 转换为嵌套 List

Convert a nested Dictionary to a nested List with List Comprehension method in Python

我想使用 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]]
 

仅仅因为屏幕上的代码更少并不意味着它的效率更高。除此之外,如果向下转换数据意味着丢失有意义的数据,那么它对于宏大来说是多余的方案。另外 python 不是从效率开始,而是从功能开始。之后您可以重新访问并改进 bottlenecks/etc...

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

但是为什么要列表? 散列 table/lookup 不是比唯一键字典的列表更有效吗?


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

>>> {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]}

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

>>> [{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]}]

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