首页 > 解决方案 > 使用映射函数-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。是什么原因造成的?如何解决?非常感谢。

标签: dictionarymap-function

解决方案


问题

在迭代 dict 时对其进行了变异。不要这样做。Pythonic 约定是:

  1. 做一个new_dict = {}
  2. 在迭代输入a_dict时,将新项目分配给new_dict.
  3. 返回new_dict

IOW,创造新事物,而不是改变旧事物——这可能是你痛苦的根源。

一些笔记

  • 定义变量名时使用带下划线的小写字母(参见PEP 8)。
  • 查找值而不是更改输入字典,例如a_dict[k]vs.a_dict.pop(k)
  • 缩进正确数量的空格(参见PEP 8

推荐阅读