如何修复get_phone_numbers_for_countries函数,使其返回含列表值的字典
修复手机号分类函数的返回结构问题
原代码的核心问题是每次通过dict.update()直接覆盖对应国家代码的值,导致最终每个键只保留最后一个匹配的手机号,而非收集所有匹配项的列表。以下是修复后的代码:
def sanitize_phone_number(phone): new_phone = ( phone.strip() .removeprefix("+") .replace("(", "") .replace(")", "") .replace("-", "") .replace(" ", "") ) return new_phone def get_phone_numbers_for_countries(list_phones): # 初始化所有目标国家代码对应的空列表,包含默认归属地UA country_numbers = {"UA": [], "JP": [], "SG": [], "TW": []} for raw_num in list_phones: cleaned_num = sanitize_phone_number(raw_num) if cleaned_num.startswith("380"): country_numbers["UA"].append(cleaned_num) elif cleaned_num.startswith("81"): country_numbers["JP"].append(cleaned_num) elif cleaned_num.startswith("65"): country_numbers["SG"].append(cleaned_num) elif cleaned_num.startswith("886"): country_numbers["TW"].append(cleaned_num) else: # 未知归属的手机号归入UA列表 country_numbers["UA"].append(cleaned_num) # 可选:过滤掉没有匹配手机号的国家代码(按需启用) # country_numbers = {code: nums for code, nums in country_numbers.items() if nums} return country_numbers
关键修改说明
- 初始化结构:提前创建包含所有目标国家代码的字典,每个键对应空列表,确保后续可以直接追加元素
- 替换赋值逻辑:用
list.append()替代dict.update(),将每个清洗后的手机号添加到对应国家的列表中,而非覆盖原有值 - 优化匹配判断:使用
str.startswith()替代切片判断,代码可读性更强 - 可选过滤:如果不需要保留没有手机号的国家代码,可以启用注释中的字典推导式过滤空列表
测试输入示例:
test_phones = ["+380998759405", "818765347", "+8867658976", "657658976", "+123456789"] print(get_phone_numbers_for_countries(test_phones))
返回结果:
{'UA': ['380998759405', '123456789'], 'JP': ['818765347'], 'SG': ['657658976'], 'TW': ['8867658976']}
内容的提问来源于stack exchange,提问作者Alduin
相关产品推荐
相关产品推荐

