使用python将键映射到多个键和关联的值

时间:2018-02-23 17:48:44

标签: python list dictionary

以下是测试代码:

dict1 = {'k1': '{v1}', 'k2':'{v2}', 'k3':'{v3}' , 'k3':'{v4}'}
list1 = ['k1_1', 'k2_2', 'k3_3', 'k3_4']

newdict = {}
for items in list1:
    val = items.split('_')[0]
    if val in dict1.keys():
        newdict[items] = dict1[val]

这会产生:

{'k1_1': '{v1}', 'k2_2': '{v2}', 'k3_3': '{v4}', 'k3_4': '{v4}'}

我真正想要的是:

{'k1_1': '{v1}', 'k2_2': '{v2}', 'k3_3': '{v3}', 'k3_4': '{v4}'}

当列表中只有一个映射和字典中的键时,上面的代码就像一个魅力。 我可以进行哪些修改以确保在密钥交换后保留值?

3 个答案:

答案 0 :(得分:1)

正如其他人所指出的那样,你的字典试图存储多个具有相同值的键,这些键只会添加最终存储键的值。相反,您可以使用元组列表:

d = [('k1', '{v1}'), ('k2', '{v2}'), ('k3', '{v3}') , ('k3', '{v4}')]
list1 = ['k1_1', 'k2_2', 'k3_3', 'k3_4']
list1 = iter(list1)
new_d = [(next(list1), b) for _, b in d]

输出:

[('k1_1', '{v1}'), ('k2_2', '{v2}'), ('k3_3', '{v3}'), ('k3_4', '{v4}')]

答案 1 :(得分:0)

这不起作用,因为[Vue warn]: Do not use built-in or reserved HTML elements as component id: data 不是有效的dict()

根据文档:

  

最好将字典视为一组无序的键:值对,,要求键是唯一的(在一个字典中)。一对大括号创建一个空字典:dict1。在括号内放置以逗号分隔的键:值对列表,将初始键:值对添加到字典中;这也是字典在输出上的写法。

您如何期望Python知道您指的是哪个{}

答案 2 :(得分:0)

根据定义,词典不允许您存储重复键,因此您必须遵循不同的方法。一种是欺骗你的字典,使你的密钥不是strings,而是一个类的实例,共享相同的名称。以下是您的示例案例的示例:

# Create a class that overrides the 'repr' method in order to print the actual key.
class Key:

   def __init__(self, name):
      self.name = name

   def __repr__(self):
      return self.name

# Create instances of the 'Key' class as keys.
dict1 = {Key('k1'): '{v1}', Key('k2'):'{v2}', Key('k3'):'{v3}' , Key('k3'):'{v4}'}
list1 = ['k1_1', 'k2_2', 'k3_3', 'k3_4']

print(dict1.keys())

dict1 = dict(zip(list1, dict1.values()))

print(dict1)

输出:

dict_keys([k1, k2, k3, k3])
{'k1_1': '{v1}', 'k2_2': '{v2}', 'k3_3': '{v3}', 'k3_4': '{v4}'}

致谢here获取最初的想法。