【问题标题】:How to update a dictionary with different list elements in Python如何在 Python 中使用不同的列表元素更新字典
【发布时间】:2021-06-28 14:57:36
【问题描述】:

我想创建一个具有以下结构的字典:

{"filename_1.wav": {
    "name": "sp1",
    "embedding": [0, 1, 2, 3]
    },
"filename_2.wav": {
    "name": "sp2",
    "embedding": [4, 5, 6, 7]
    },
"filename_3.wav": {
    "name": "sp3",
    "embedding": [8, 9, 10, 11]
    },
}

内部字典中的键 nameembedding 保持不变,而它们的值根据文件名而变化。

这是我目前的代码:

outer_dict = {}
inner_dict = {}

audio_filenames = ['filename_1.wav', 'filename_2.wav', 'filename_3.wav']
embeddings = [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
speaker_ids = ['sp1', 'sp2', 'sp3']

for audio in audio_filenames:
    outer_dict[audio] = inner_dict

for e in embeddings:
    for s in speaker_ids:
        inner_dict['name'] = s
        inner_dict['embedding'] = e

print(dict(outer_dict))

我的输出如下所示:

{'filename_1.wav': {
    'name': 'sp3', 
    'embedding': [8, 9, 10, 11]},
 'filename_2.wav': {
    'name': 'sp3', 
    'embedding': [8, 9, 10, 11]}, 
'filename_3.wav': {
    'name': 'sp3', 
    'embedding': [8, 9, 10, 11]}
}

如您所见,只有音频文件名被正确更新,而从扬声器 ID 和嵌入列表中只获取最后一个元素。

谁能告诉我如何更新扬声器 ID 和嵌入?

谢谢!

【问题讨论】:

    标签: python-3.x list dictionary


    【解决方案1】:

    这里有几个问题。

    您当前正在覆盖同一个内部字典,并且所有 outer_dictvalues 都指向同一个 inner_dict 对象。您需要为外部字典中的每个条目创建一个新的inner_dict 对象。

    此外,您不希望使用嵌套的 for 循环来分配嵌入和扬声器 ID。

    相反,请尝试一一分配每个键及其内部字典的值。这是一个例子:

    outer_dict = {}
    
    audio_filenames = ['filename_1.wav', 'filename_2.wav', 'filename_3.wav']
    embeddings = [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
    speaker_ids = ['sp1', 'sp2', 'sp3']
    
    for i in range(len(audio_filenames)):
        inner_dict = {}
        
        inner_dict['name'] = speaker_ids[i]
        inner_dict['embedding'] = embeddings[i]
    
        outer_dict[audio_filenames[i]] = inner_dict
    
    print(outer_dict)
    
    

    【讨论】:

      【解决方案2】:

      使用理解列表表达式。如果三个列表的长度相同,则可以使用此答案。

      response_dict = {audio_filenames[index]: {'embedding': embeddings[index], 'name': speaker_ids[index]} for index, _ in enumerate(audio_filenames)}
      print(response_dict)
      

      输出:

      {'filename_1.wav': {'embedding': [0, 1, 2, 3], 'name': 'sp1'},
       'filename_2.wav': {'embedding': [4, 5, 6, 7], 'name': 'sp2'},
       'filename_3.wav': {'embedding': [8, 9, 10, 11], 'name': 'sp3'}}
      

      【讨论】:

        【解决方案3】:
        audio_filenames = ['filename_1.wav', 'filename_2.wav', 'filename_3.wav']
        embeddings = [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
        speaker_ids = ['sp1', 'sp2', 'sp3']
        
        Dict = {}
        
        
        for a,b,c in zip(speaker_ids, embeddings, audio_filenames):
            # print(a,b,c)
            Dict[c] = {}
            Dict[c]['name'] = a
            Dict[c]['embedding'] = b
        
        print Dict
        

        【讨论】:

        • 欢迎来到 Stack Overflow,感谢您的贡献。请查看此线程上已接受的答案,以了解提交答案时预期的解释程度。
        • 避免使用dictlisttuple等保留字作为变量名
        猜你喜欢
        • 1970-01-01
        • 2022-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多