首页 > 解决方案 > 用它的一个值交换一个键——python字典——另一个问题

问题描述

我有以下示例,我已经看到了这段代码的执行流程,并且我知道它有问题,因此我无法从代码中获得所需的结果。但是,我尝试了很多方法,但仍然不知道,我怎样才能得到想要的结果。

代码:

dict1 = {10: [22], 40: [50, 20, 60]}
new_dict = {}
for k, v in dict1.items():
    for each_v in v:
        if each_v < k:
            v.remove(each_v)
            # temp_v = v.copy()
            # temp_v.remove(each_v)
            new_dict[each_v] = [k] + v
            # print(temp_v)
            # print(v)
    else:
        new_dict[k] = v
print(new_dict)

电流输出:

{10: [22], 20: [40, 50, 60], 40: [50, 60]}

期望的输出:

{10: [22], 20: [40, 50, 60]}
*keep the original order*

我只想要交换它的IFkey和其中一个IF比这个。我不想在字典中添加更多项目。还valuekeyvalue

如果大家有什么建议,欢迎评论,先谢谢了!

标签: pythondictionary

解决方案


我的方法:遍历所有键值对的副本。如果值列表的值小于键,我们删除键。然后我们用键替换列表中的最小值,并将该值用作新键。

dict1 = {10: [22], 40: [50, 20, 60]}
for k, v in list(dict1.items()): # using list() to copy the dict's items
                                 # since we are going to delete a key
    min_v = min(v)
    if min_v < k:
        del dict1[k]
        min_v_index = v.index(min_v)
        v[min_v_index] = k
        dict1[min_v] = sorted(v)

print(dict1)

输出

{10: [22], 20: [40, 50, 60]}

警告

如果候选键已经是原始字典中的键,您将遇到问题。考虑拥有{10: [22], 25: [10]}. 这将尝试创建具有重复10键的字典。上面的代码将输出{10: [25]}.

解决方案是检查新键是否已经存在于原始字典中,如果存在,只需将该值附加到该键的列表中,然后对其进行排序。我将把实现留给读者作为练习。


推荐阅读