如何比较字典中的所有值

时间:2014-04-18 08:56:31

标签: python-3.x

我有一个字典,其名称为键,数字为值。我想创建一个列表,其中包含彼此更接近的字典值。所有值表示虚构的5x5网格中的单元格。所以我想检查网格中哪两个值彼此更接近。

实施例

my_dict = {Mark:2, Luke:6, Ferdinand:10, Martin:20, Marvin: 22}

我想得到马丁和马文的价值,因为它的价值彼此更接近。

2 个答案:

答案 0 :(得分:0)

这适用于任何大小的字典,并为您提供最小值的对。它使用itertools来完成所有组合。

from itertools import combinations
my_dict = {'Mark': 2, 'Luke': 6, 'Ferdinand': 7, 'Martin': 20, 'Marvin': 22}
for value in combinations(my_dict.items(), 2):
    current_diff = abs(value[0][1] - value[1][1])
    pair_of_interest = (value[0][0], value[1][0])
    try:
        if current_diff < difference:
            difference = current_diff
            pair = pair_of_interest
    except NameError:
        difference = current_diff
        pair = pair_of_interest
print("{0} and {1} have the smallest distance of {2}".format(pair[0], pair[1], difference))

答案 1 :(得分:0)

我假设字典中的值是这样的。

+----+----+----+----+-------->x  
|  1 |  2 |  3 |  4 |  5 | 
+----+----+----+----+----+  
|  6 |  7 |  8 |  9 | 10 |
+----+----+----+----+----+  
| 11 | 12 | 13 | 14 | 15 |
+----+----+----+----+----+  
| 16 | 17 | 18 | 19 | 20 |
+----+----+----+----+----+  
| 21 | 22 | 23 | 24 | 25 |
+----+----+----+----+----+  
|
v
y

ie:

1 => (y,x)=(0,0)
2 => (y,x)=(0,1)
...
24 => (y,x)=(4,3)
25 => (y,x)=(4,4)

源代码:

import itertools
my_dict = {'Mark':2, 'Luke':6, 'Ferdinand':10, 'Martin':20, 'Marvin': 22}

val2vec  = lambda v: (v/5, v%5)
name2vec = lambda name: val2vec(my_dict[name])
vec2dis2 = lambda vec1, vec2: (vec2[0] - vec1[0])**2 + (vec2[1] - vec1[1])**2 #Use 'math.sqrt' if you want.

for dis2, grp in sorted((vec2dis2(name2vec(name1), name2vec(name2)), (name1, name2)) for name1, name2 in itertools.combinations(my_dict.iterkeys(), 2)):
    print str(grp).ljust(30), "distance^2 =", dis2

输出:

('Luke', 'Ferdinand')          distance^2 = 2
('Luke', 'Mark')               distance^2 = 2
('Ferdinand', 'Martin')        distance^2 = 4
('Martin', 'Marvin')           distance^2 = 4
('Ferdinand', 'Mark')          distance^2 = 8
('Ferdinand', 'Marvin')        distance^2 = 8
('Luke', 'Martin')             distance^2 = 10
('Luke', 'Marvin')             distance^2 = 10
('Marvin', 'Mark')             distance^2 = 16
('Martin', 'Mark')             distance^2 = 20