dictionary - 使用映射函数-Python更新列表内的字典键
问题描述
我有一个电话号码字典,其中数字是键,国家是值。我想根据值国家/地区更新密钥并添加国家/地区代码。我尝试为此使用地图功能:
print('**Exmaple: Update phone book to add Country code using map function** ')
user=[{'952-201-3787':'US'},{'952-201-5984':'US'},{'9871299':'BD'},{'01632 960513':'UK'}]
#A function that takes a dictionary as arg, not list. List is the outer part
def add_Country_Code(aDict):
for k,v in aDict.items():
if(v == 'US'):
aDict[( '1+'+k)]=aDict.pop(k)
if(v == 'UK'):
aDict[( '044+'+k)]=aDict.pop(k)
if (v == 'BD'):
aDict[('001+'+k)] =aDict.pop(k)
return aDict
new_user=list(map(add_Country_Code,user))
print(new_user)
这在我运行时部分工作,输出如下: [{'1+952-201-3787': 'US'}, {'1+1+1+952-201-5984': 'US'}, {'001 +9871299': 'BD'}, {'044+01632 960513': '英国'}]
请注意,第二个美国号码有 2 个额外的 1。是什么原因造成的?如何解决?非常感谢。
解决方案
问题
您在迭代 dict 时对其进行了变异。不要这样做。Pythonic 约定是:
- 做一个
new_dict = {}
- 在迭代输入
a_dict
时,将新项目分配给new_dict
. - 返回
new_dict
IOW,创造新事物,而不是改变旧事物——这可能是你痛苦的根源。
一些笔记
推荐阅读
- c - 代码仅返回按字母顺序排列的第一个字母,而不返回其余字母
- python-3.x - Define vectors and find angles using Python in 3D space?
- c++ - putenv warning with C++
- wpf - 使 WPF TextBlock 文本在扩展器中垂直
- python - saving the bounding box image
- ios - Getting text in scrollview to start at the top, not the bottom (Objective-C)
- php - 如何让我的 Angular 前端与 PHP 后端通信?
- c++ - How does std::atomic ensure atomicity
- python-3.x - 如何在python中使用pickle序列化套接字对象
- python - 在没有重置参数的情况下在 tensorflow 后端加载 keras 模型