字典分解并创建一个具有相同值的新字典

4

我有一个字典myDict

{'1': 5, '2': 13, '3': 23, '4': 17}

我正在使用这段代码,它一直很有效,以便在myDict中查找最接近targetVal的键/值对。
answer = key, value = min(myDict.items(), key=lambda (_, v): abs(v - targetVal))

假设targetVal14answer返回:
('2': 13)

现在我需要处理myDict中相同的值。例如,如果myDict现在是这样的:
{'1': 5, '2': 13, '3': 23, '4': 13}

我需要那些值为13的键/值对。在代码(上面)查找到myDict中最接近的值,且该值出现多次的情况下,我想创建一个新字典。在这种情况下,answer将返回:

{'2': 13, '4': 13}

是否有可能更新找到answer的方式,以考虑最接近的值出现多次的情况?


{k:v for k,v in myDict.items() if v == answer[1]} - Chris_Rands
3
dict不是这种任务的好数据结构。 - wim
我会使用元组列表,但最近我一直在使用字典,所以我更习惯操作它们。 - yodish
@Chris_Rands,answer 只是一个键值对吗? - yodish
你没有尝试我的解决方案吗?answer[1]是值,它有效。 - Chris_Rands
@Chris_Rands 我试了一下,但是出现了错误;不过可能是我的操作问题 :) - yodish
2个回答

3

首先找到最小值,然后筛选您的dict

>>> d = {'1': 5, '2': 13, '3': 23, '4': 13}
>>> target = 13
>>> min_ = min(d.itervalues(), key=lambda v: abs(v - target))
>>> {k:v for k,v in d.iteritems() if v == min_}
{'2': 13, '4': 13}

2

正如您所发现的,min仅提供满足最小条件的一个项目。 您可以通过手动循环构建一次性解决方案:

from math import inf

myDict = {'1': 5, '2': 13, '3': 23, '4': 13}
targetVal = 14

res = {}
diff = inf
for k, v in myDict.iteritems():
    current_diff = abs(v - targetVal)
    if current_diff <= diff:
        if current_diff < diff:
            diff = current_diff
            res.clear()
        res.update({k: v})

print(res)

# {'2': 13, '4': 13}

1
如果您不想从“math”中导入,使用“float('inf')也可以。 - timgeb
1
@timgeb,谢谢,学到了新知识!它们当然是等价的。 - jpp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接