通过 python 在字典中打印字典中的数字
Printing numbers in a dictionary inside a dictionary by python
我想打印字典里面的数字:
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
对于此代码,它只保留最后的值:
{'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}}
我怎样才能做到这一点?
看起来所有词典之间都有一些共享内存。
您可以使用字典理解构造字典:
{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}
}
这应该有效
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}}
可以从嵌套字典理解得到,但是有点长:
{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}}
你的问题是你在你的外部 for-loop 的每次迭代中重置 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
中的每个项目,我们随后将项目添加到字典中,然后将其添加到更大的字典中。 dx
添加到字典的值是根据pd
的第j个条目和frames
的第i个条目。
更好的变量名有助于跟踪正在发生的事情。可读性很重要 vs. one-liner 列表理解。原始代码是在每一帧中插入相同的修改字典。
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}}
我想打印字典里面的数字:
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
对于此代码,它只保留最后的值:
{'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}}
我怎样才能做到这一点?
看起来所有词典之间都有一些共享内存。
您可以使用字典理解构造字典:
{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}
}
这应该有效
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}}
可以从嵌套字典理解得到,但是有点长:
{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}}
你的问题是你在你的外部 for-loop 的每次迭代中重置 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
中的每个项目,我们随后将项目添加到字典中,然后将其添加到更大的字典中。 dx
添加到字典的值是根据pd
的第j个条目和frames
的第i个条目。
更好的变量名有助于跟踪正在发生的事情。可读性很重要 vs. one-liner 列表理解。原始代码是在每一帧中插入相同的修改字典。
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}}