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"}
转换后:
DictX={“苹果”: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
您的问题是您使用的是词典或其键和值的新本地副本
如果问题是返回一个新字典,那么