通过组合多个其他词典来创建有组织的词典

2024-04-29 03:44:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图通过从3个单独的字典中提取值的过程,在python中创建一个主字典。这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

Tags: csvinforreadline字典timeaswith
3条回答

这里有两个函数来创建一个“主字典”,它只包含所有输入字典共有的值。您给出的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)

是的,正如@user3885927所指出的,您的语法是错误的。你知道吗

将结果作为元组列表的dict,您可以执行以下操作:

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

或者作为一个列表元组的dict:

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

@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的键访问元素,并将它们全部附加到Final['key']的数组中。这应该让你开始,我可以回答更多的问题。你知道吗

这是根据您的评论更新的: 如果键在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

相关问题 更多 >