如何反转含多值元素的Python字典?解决反转丢键值对问题
问题:反转Python字典时丢失嵌套字典对应的键值对
我尝试反转一个Python字典,但反转后的字典丢失了最后一组键值对。该键对应的值是包含两个元素的嵌套字典,这是它与其他键值对的唯一区别。当前代码仅反转了前3个姓名与号码的键值对,最后一个完全未出现在反转结果中。请问如何反转字典中的全部四个值?
contacts = { "John A": "858 900 1001", "Jillian": "858 900 1002", "Ron": "858 900 1003", "Miranda": { "mobile": "858 900 1004", "home": "555 1284" } } sorted(contacts.keys()) for key in contacts: value = contacts[key] if key == "Miranda" and 'mobile' in value: print(f"contact: {key}, mobile number: {value['mobile']}") else: print(f"contact: {key}, mobile number: {value}") contacts_inv = {value: key for key, value in contacts.items() if isinstance(value, str)} print(contacts_inv)
我尝试使用标准的字典推导式反转方法{v: k for k, v in contacts.items() if isinstance(value, str)},但该方法仅反转了前3个值,无法覆盖全部内容。
问题原因
你的字典推导式里添加了if isinstance(value, str)的过滤条件,这会直接排除所有值不是字符串的项。Miranda对应的值是嵌套字典,不满足该条件,所以被过滤掉了。
解决方案
方案1:将嵌套字典中的每个号码单独反转
如果希望把Miranda的两个号码都作为反转字典的键,对应值为她的名字,可以用循环逐个处理:
contacts_inv = {} for name, info in contacts.items(): if isinstance(info, str): # 普通字符串号码直接反转 contacts_inv[info] = name else: # 遍历嵌套字典中的所有号码,逐个添加到反转字典 for number in info.values(): contacts_inv[number] = name print(contacts_inv)
运行结果:
{ '858 900 1001': 'John A', '858 900 1002': 'Jillian', '858 900 1003': 'Ron', '858 900 1004': 'Miranda', '555 1284': 'Miranda' }
方案2:将嵌套字典转换为可哈希类型作为键
如果需要把整个嵌套字典作为反转后的键,由于字典本身不可哈希(不能作为字典的键),需要先将其转换为可哈希的类型,比如排序后的键值对元组:
contacts_inv = {} for name, info in contacts.items(): if isinstance(info, str): contacts_inv[info] = name else: # 将嵌套字典转为排序后的键值对元组,保证哈希唯一性 hashable_info = tuple(sorted(info.items())) contacts_inv[hashable_info] = name print(contacts_inv)
运行结果:
{ '858 900 1001': 'John A', '858 900 1002': 'Jillian', '858 900 1003': 'Ron', (('home', '555 1284'), ('mobile', '858 900 1004')): 'Miranda' }
内容的提问来源于stack exchange,提问作者newcoder445
相关产品推荐
相关产品推荐

