python - 通过 python 在 dictionary 内的 dictionary 中打印数字

我想在 dictionary 内的 dictionary 中打印数字:

frame = ['frame1', 'frame2', 'frame3', 'frame4', 'frame5', 'frame6']
dx = [12, 34, 55, 66, 78, 65, 56, 234, 876, 999, 345, 945]
pd = ['pd1', 'pd2']

data = {}
dt = {}
k=0
for i in pd :
    dt[i] = []
    for j in frame :
        data[j] = dt
        data[j][i] = dx[k]
        k+=1

对于此代码,它只保留最后一个 values:

{'frame1': {'pd1': 65, 'pd2': 945}, 'frame2': {'pd1': 65, 'pd2': 945}, 'frame3': {'pd1': 65, 'pd2': 945}, 'frame4': {'pd1': 65, 'pd2': 945}, 'frame5': {'pd1': 65, 'pd2': 945}, 'frame6': {'pd1': 65, 'pd2': 945}}

这是我想要的结果:

{'frame1': {'pd1': 12, 'pd2': 56}, 'frame2': {'pd1': 34, 'pd2': 234}, 'frame3': {'pd1': 55, 'pd2': 876}, 'frame4': {'pd1': 66, 'pd2': 999}, 'frame5': {'pd1': 78, 'pd2': 345}, 'frame6': {'pd1': 65, 'pd2': 945}}

我怎样才能做到这一点?

回答1

看起来所有 dictionaries 都有一些共享内存。

您可以使用 dictionary 推导式构造 dictionary:

{f: dict(zip(pd, vals)) for f, vals in zip(frame, zip(dx[:len(dx)//2], dx[len(dx)//2:]))}

这输出:

{
 'frame1': {'pd1': 12, 'pd2': 56}, 'frame2': {'pd1': 34, 'pd2': 234}, 
 'frame3': {'pd1': 55, 'pd2': 876}, 'frame4': {'pd1': 66, 'pd2': 999}, 
 'frame5': {'pd1': 78, 'pd2': 345}, 'frame6': {'pd1': 65, 'pd2': 945}
}

回答2

您可以从嵌套的 dictionary 理解中获取它,但它有点长:

{f: d for f, d in zip(frame, {pd[0]: i, pd[1]: j} for i, j in zip(dx[:len(frame)], dx[len(frame):]))}

一点简化:

dict(zip(frame, (dict(zip(pd, x)) for x in zip(dx[:len(frame)], dx[len(frame):]))))

输出:

{'frame1': {'pd1': 12, 'pd2': 56},
 'frame2': {'pd1': 34, 'pd2': 234},
 'frame3': {'pd1': 55, 'pd2': 876},
 'frame4': {'pd1': 66, 'pd2': 999},
 'frame5': {'pd1': 78, 'pd2': 345},
 'frame6': {'pd1': 65, 'pd2': 945}}

回答3

这应该工作

data = {}
k=0
for i in pd:
    for j in frame :
        # use setdefault to initialize inner dictionary
        data.setdefault(j, {})[i] = dx[k]
        k+=1
data
{'frame1': {'pd1': 12, 'pd2': 56},
 'frame2': {'pd1': 34, 'pd2': 234},
 'frame3': {'pd1': 55, 'pd2': 876},
 'frame4': {'pd1': 66, 'pd2': 999},
 'frame5': {'pd1': 78, 'pd2': 345},
 'frame6': {'pd1': 65, 'pd2': 945}}

回答4

您的问题是您在外部 for 循环的每次迭代中都重置 dt 。要获得所需的输出,只需执行此操作

for i in pd:
    for j in frame:
        if j not in data:
            data[j] = dict()
        data[j][i] = dx[k]
        k += 1

您可以将其压缩成这样的列表理解:

data = {f: {p: dx[j * len(frame) + i] for j, p in enumerate(pd)} for i, f in enumerate(frame)}

此压缩迭代 frames,并且对于 frames 中的每个项目,迭代 pd。对于 pd 中的每个项目,我们在将项目添加到较大的 dictionary 时将项目添加到 dictionary。添加到dictionary 的dx 的value 是基于pd 的第j 个条目和frames 的第i 个条目。

回答5

更好的变量名称有助于跟踪正在发生的事情。可读性计数与单行列表理解。原始代码在每一帧中插入相同的修改 dictionary 。

from pprint import pprint

frames = ['frame1', 'frame2', 'frame3', 'frame4', 'frame5', 'frame6']
dx = [12, 34, 55, 66, 78, 65, 56, 234, 876, 999, 345, 945]
pds = ['pd1', 'pd2']

# Initialize each frame with a *different* empty dictionary
data = {frame:{} for frame in frames}

# Distribute dx across the frames and pds:
idx = iter(dx)
for pd in pds:
    for frame in frames:
        data[frame][pd] = next(idx)

pprint(data)

输出:

{'frame1': {'pd1': 12, 'pd2': 56},
 'frame2': {'pd1': 34, 'pd2': 234},
 'frame3': {'pd1': 55, 'pd2': 876},
 'frame4': {'pd1': 66, 'pd2': 999},
 'frame5': {'pd1': 78, 'pd2': 345},
 'frame6': {'pd1': 65, 'pd2': 945}}

相似文章

java - 优化SQLITE到store大量词

我正在尝试用SQLite数据库替换我们保存在内存中的大文本文件。我们有这个大文件,其中包含我们在用户创建新密码时拒绝的常用密码。它大约有4M行,磁盘上有41MB(未压缩,压缩为11MB)。我们历史上在...

最新文章