通过组合多个其他字典创建一个有组织的字典
我想创建一个在Python中的主字典通过拉动值形式3个单独的字典的过程。 3个字典是这个样子:通过组合多个其他字典创建一个有组织的字典
X = {'0':[1, 3, 4, 5], '.001':[2, 4, 6, 7]}
Y = {'0':[5, 6, 9, 2], '.001':[2, 6, 8, 4]}
Z = {'0':[3, 6, 8, 9], '.001':[3, 1, 5, 8]}
我希望能够将这些字典合并成一个单一的主字典,集团从X,Y和Z,从X,Y的第二个值的第一个值,Z等等。最终字典看起来像这样:
Final = {'0':[1, 5, 3], [3, 6, 6], [4, 9, 8], [5, 2, 9], '.001':[2, 2, 3].....
等等。我相信我需要使用for循环,但我不确定。任何帮助是极大的赞赏。
这是我迄今的代码。所有的单个字典都可以正确创建,但最后一个不会。
Xcoord = {}
time = []
with open ('Nodal_QuardnetsX2.csv', 'r') as f:
f.readline() # Skips first line
for line in f:
values = [s.strip()for s in line.split(',')]
Xcoord[values[0]] = map(float, values[1:])
time.append(values[0])
print time
Ycoord = {}
with open ('Nodal_QuardnetsY2.csv', 'r') as f:
f.readline() # Skips first line
for line in f:
values = [s.strip()for s in line.split(',')]
Ycoord[values[0]] = map(float, values[1:])
Zcoord = {}
with open ('Nodal_QuardnetsZ2.csv', 'r') as f:
f.readline() # Skips first line
for line in f:
values = [s.strip()for s in line.split(',')]
Zcoord[values[0]] = map(float, values[1:])
counter = 0
k = len(Xcoord)
for time in range(k):
CoordCombo[time] = Xcoord[counter], Ycoord[counter], Zcoord[counter]
counter = counter + 1
@JackRandall,他们语法在最后的字典是不正确的。我建议你阅读https://docs.python.org/2/tutorial/datastructures.html#dictionaries以了解字典。你可能希望你的最终解释是这样的,而不是:
Final = {'0':[[1, 5, 3], [3, 6, 6], [4, 9, 8], [5, 2, 9]], '.001':[[2, 2, 3].....]}
而且要开始,你可以通过在X你的钥匙环,然后用Y的键访问元素和Z和追加他们都最终的阵列['键']。这应该让你开始,我可以回答更多问题。
这是根据您的意见更新: 如果该键不存在X将它插入无
X = {'0':[1, 3, 4, 5], '.001':[2, 4, 6, 7], 'XonlyKey':[1,1,1,1,]}
Y = {'0':[5, 6, 9, 2], '.001':[2, 6, 8, 4]}
Z = {'0':[3, 6, 8, 9], '.001':[3, 1, 5, 8]}
Final={}
for key, value in X.iteritems():
tempArray=[value]
for tempDict in (Y,Z):
if key in tempDict:
tempArray.append(tempDict[key])
else:
tempArray.append(None)
Final[key]=tempArray
是为@ user3885927指出你的语法是错误的。
有了结果作为元组的列表的字典,你可以这样做:
>>> {key: zip(X[key], Y[key], Z[key]) for key in X.keys()}
{'0': [(1, 5, 3), (3, 6, 6), (4, 9, 8), (5, 2, 9)], '.001': [(2, 2, 3), (4, 6, 1), (6, 8, 5), (7, 4, 8)]}
或者以列表的元组的字典:
>>> {key: tuple([[x, y, z] for x, y, z in zip(X[key], Y[key], Z[key])]) for key in X.keys()}
{'0': ([1, 5, 3], [3, 6, 6], [4, 9, 8], [5, 2, 9]), '.001': ([2, 2, 3], [4, 6, 1], [6, 8, 5], [7, 4, 8])}
有没有什么方法可以在脚本文件中编写它? – 2014-08-28 16:57:58
您可以在脚本中使用'{key:zip(X [key],Y [key],Z [key])行来编写X.keys()}'中的键,但请注意,使用{}在Python 2.6及更早版本中不起作用。你需要在X.keys()]中键入'dict([(key,zip(X [key],Y [key],Z [key]))'' – 2014-08-28 18:00:15
非常感谢 – 2014-08-28 18:07:52
这里有两个函数来创建一个“主字典“,它只包含所有输入字典通用的值。您给出的X,Y,Z示例没有任何三个词典共有的值,因此您最终会得到一个空字典。
X = {'0':[1, 3, 4, 5], '.001':[2, 4, 6, 7]}
Y = {'0':[5, 6, 9, 2], '.001':[2, 6, 8, 4]}
Z = {'0':[3, 6, 8, 9], '.001':[3, 1, 5, 8]}
dictionaries = [X,Y,Z]
def compare(d1, d2):
d3 = {}
for key in d1:
for v in d1[key]:
if v in d2[key]:
if key in d3:
d3[key].append(v)
else: d3[key] = [v,]
return d3
def createMaster(dictionaries):
length = len(dictionaries)
if length == 1:
return dictionaries[0]
d1 = dictionaries.pop()
d2 = dictionaries.pop()
d3 = compare(d1, d2)
if length == 2:
return = d3
else:
dictionaries.append(d3)
return createMaster(dictionaries)
你有任何代码与我们分享,我们可以帮助你调试吗? – skrrgwasme 2014-08-28 15:16:28
是Scott我添加了一些代码。任何帮助都很棒! – 2014-08-28 15:23:13
这可能是你想要的假设关键'时间'存在。如果没有,你必须检查是否在Ycoord的时间,然后添加。在Xcoord中的时间:CoordCombo [time] = [Xcoord [time],Ycoord [time],Zcoord [time]] – user3885927 2014-08-28 15:37:28