Python在字典上循环,用另一个字典中的值替换键

Python在字典上循环,用另一个字典中的值替换键,python,loops,dictionary,Python,Loops,Dictionary,我有一个字典,我想将该字典中的所有键更改为另一个字典中的值 例如: X = {"apple" : 42} Y = {"apple" : "Apples"} 转换后: DictX={“苹果”:42} def convert(items, ID): for key, value in items.items(): for keys, values in ID.items(): if keys == key: key

我有一个字典,我想将该字典中的所有键更改为另一个字典中的值

例如:

X = {"apple" : 42}

Y = {"apple" : "Apples"}
转换后:

Dict
X={“苹果”:42}

def convert(items, ID):
    for key, value in items.items():
        for keys, values in ID.items():
            if keys == key:
                key = values
    return items

因此,我编写上述代码就是为了这样做,但是在执行此函数后,我打印了字典,并且键没有更改。

这是因为您正在为局部变量分配新值,而不是为字典键分配新值

但是,为了获得期望的结果,我建议按照其他人的建议,创建一个新词典,因为您的键与任何现有词典都不一致:

如果要这样做,必须通过字典赋值显式设置值:

def convert(X, Y):
    new_dict = {}
    for x_key, x_value in X.items():
        for y_key, y_value in Y.items():
            if x_key == y_key:
                new_dict[y_value] = x_value

    return new_dict

这是因为您正在为局部变量分配新值,而不是为字典键分配新值

但是,为了获得期望的结果,我建议按照其他人的建议,创建一个新词典,因为您的键与任何现有词典都不一致:

如果要这样做,必须通过字典赋值显式设置值:

def convert(X, Y):
    new_dict = {}
    for x_key, x_value in X.items():
        for y_key, y_value in Y.items():
            if x_key == y_key:
                new_dict[y_value] = x_value

    return new_dict

在第一个循环中,您正在迭代
(键,值)
对。更改
变量的值不会在字典中更新它

您需要做的是将
重新分配给新的
)和
删除
旧键。本例创建了一个新副本,因此它不会在适当的位置修改dict。我还删除了内部的
for循环
,因为在python中,您可以通过使用
if key in dictionary
检查关键字是否在dict中,而无需迭代所有关键字

def convert(items, id):
    new_dict = items.copy()
    for key, value in items.items():
        if key in id:
            new_key = id[key]
            new_dict[new_key] = items[key] # Copy the value
            del new_dict[key]
    return new_dict
ipython会话示例:

In [1]: items = {'apple': 42, 'orange': 17}

In [2]: new_keys = {'apple': 'banana', 'orange': 'tangerine'}

In [3]: def convert(items, ID):
            ...

In [13]: convert(items, new_keys)
Out[13]: {'banana': 42, 'tangerine': 17} # Updated dict returned

In [14]: items
Out[14]: {'apple': 42, 'orange': 17} # Original dict stays untouched

在第一个循环中,您正在迭代
(键,值)
对。更改
变量的值不会在字典中更新它

您需要做的是将
重新分配给新的
)和
删除
旧键。本例创建了一个新副本,因此它不会在适当的位置修改dict。我还删除了内部的
for循环
,因为在python中,您可以通过使用
if key in dictionary
检查关键字是否在dict中,而无需迭代所有关键字

def convert(items, id):
    new_dict = items.copy()
    for key, value in items.items():
        if key in id:
            new_key = id[key]
            new_dict[new_key] = items[key] # Copy the value
            del new_dict[key]
    return new_dict
ipython会话示例:

In [1]: items = {'apple': 42, 'orange': 17}

In [2]: new_keys = {'apple': 'banana', 'orange': 'tangerine'}

In [3]: def convert(items, ID):
            ...

In [13]: convert(items, new_keys)
Out[13]: {'banana': 42, 'tangerine': 17} # Updated dict returned

In [14]: items
Out[14]: {'apple': 42, 'orange': 17} # Original dict stays untouched

调用
items.items()
时,您正在创建字典的
(键、值)
对的副本

因此,当您更改
键的值时,您更改的是副本的值,而不是原始值

def convert(items, ID):
    for key, value in items.items():
        for keys, values in ID.items():
            if keys == key:
                items[key] = values
    return items

调用
items.items()
时,您正在创建字典的
(键、值)
对的副本

因此,当您更改
键的值时,您更改的是副本的值,而不是原始值

def convert(items, ID):
    for key, value in items.items():
        for keys, values in ID.items():
            if keys == key:
                items[key] = values
    return items

您需要修改现有词典而不是创建新词典的原因是什么

要通过创建新词典来执行相同的任务,请尝试以下操作:

def convert(items, ID):
    result = {}
    for key, value in items.items():
        if key in ID.keys():
            result[ID[key]] = value
        else:
            result[key] = value
    return result
如果您真的想修改原始词典,您仍然需要创建一个临时的新词典,然后用新词典的内容填充原始词典,如下所示

def convert(items, ID):
    result = {}
    for key, value in items.items():
        if key in ID.keys():
            result[ID[key]] = value
        else:
            result[key] = value
    items.clear()
    for key, value in result.items():
        items[key] = value
    return items 
如果您不这样做,那么您必须担心覆盖值,也就是说,您试图将密钥重命名为已经存在的某个值。这里有一个例子来说明我的意思:

items = {"apples": 10, "bananas": 15}
ID = {"apples": "bananas", "bananas": "oranges"}
convert(items, ID)
print items
我假设您想要的行为是以
{“香蕉”:10,“橙子”:15}
结束。如果它首先将
“苹果”
重命名为
“香蕉”
,该怎么办?然后是
{“香蕉”:10}
,它将变成
{“橙子”:10}


最糟糕的是,这完全取决于python遍历键的顺序,这取决于您首先添加键的顺序。如果在python的未来版本中发生这种变化,那么程序的行为可能会发生变化,这是您绝对希望避免的。

是否有理由需要修改现有词典而不仅仅是创建新词典

要通过创建新词典来执行相同的任务,请尝试以下操作:

def convert(items, ID):
    result = {}
    for key, value in items.items():
        if key in ID.keys():
            result[ID[key]] = value
        else:
            result[key] = value
    return result
如果您真的想修改原始词典,您仍然需要创建一个临时的新词典,然后用新词典的内容填充原始词典,如下所示

def convert(items, ID):
    result = {}
    for key, value in items.items():
        if key in ID.keys():
            result[ID[key]] = value
        else:
            result[key] = value
    items.clear()
    for key, value in result.items():
        items[key] = value
    return items 
如果您不这样做,那么您必须担心覆盖值,也就是说,您试图将密钥重命名为已经存在的某个值。这里有一个例子来说明我的意思:

items = {"apples": 10, "bananas": 15}
ID = {"apples": "bananas", "bananas": "oranges"}
convert(items, ID)
print items
我假设您想要的行为是以
{“香蕉”:10,“橙子”:15}
结束。如果它首先将
“苹果”
重命名为
“香蕉”
,该怎么办?然后是
{“香蕉”:10}
,它将变成
{“橙子”:10}

最糟糕的是,这完全取决于python遍历键的顺序,这取决于您首先添加键的顺序。如果在python的未来版本中发生这种变化,那么程序的行为可能会发生变化,这是您绝对希望避免的。

使用“设置交点”计算共享关键点

pre-2.7的代码 代码为2.7+ 2.7之前的测试 2.7的测试+ 方法 使用“设置交点”计算共享关键点

pre-2.7的代码 代码为2.7+ 2.7之前的测试 2.7的测试+
您的问题是您使用的是词典或其键和值的新本地副本

如果问题是返回一个新词典,那么这将在一行中工作

def convert(x,y):
    return dict( (y.get(k,k), x[k]) for k in x )
x={'a':10, 'b':5}
y={'a':'A'}
print convert(x,y)
在Python2.7+中,您甚至可以

def convert(x,y):
     return { y.get(k,k): x[k] for k in x }
但是如果你想在同一个输入字典中工作,那么

def convert(x,y):
     r={ y.get(k,k): x[k] for k in x }
     for k in x.keys(): del x[k]
     x.update(r)

x={'a':10, 'b':5}
y={'a':'A'}
convert(x,y)
print x

您的问题是您使用的是词典或其键和值的新本地副本

如果问题是返回一个新字典,那么