2015-12-30 128 views
2

最大的价值我有一个Python字典象下面这样:查找Python字典

{ '1': {'a': '0.6', 'b': '0.8', 'c': '2','d': '0.5'}, 
    '2': {'a': '0.7', 'b': '0.9', 'c': '0.1','d': '0.2'}, 
    '3': {'a': '0.5', 'b': '0.8', 'c': '3'}, 
} 

我怎么能得到下面的结果呢?

('2','a','0.7') ('2',b','0.9') ('3','c', '3') ('1','d', '0.5') 
+2

嗯,你可能必须在这里更具体一些。 – Kris

+1

寻找最大价值的逻辑是什么? – vks

+0

是的,找到最大的价值,并把它们放在一组 – bob

回答

0
x={ '1': {'a': '0.6', 'b': '0.8', 'c': '2','d': '0.5'}, 
'2': {'a': '0.7', 'b': '0.9', 'c': '0.1','d': '0.2'}, 
'3': {'a': '0.5', 'b': '0.8', 'c': '3'}, 
} 

d={} 
for i,j in x.iteritems(): 
    for k,m in j.iteritems(): 
     d.setdefault(k,[0,0]) 
     if j[k]>d[k][0]: 
      d[k]=(j[k],i) 
print [(j[1],i,j[0]) for i,j in d.items()] 

你可以使用额外的dict来完成你的工作。

输出:[('2', 'a', '0.7'), ('3', 'c', '3'), ('2', 'b', '0.9'), ('1', 'd', '0.5')]

+0

谢谢!这就是我需要的 – bob

2

嗯,这里是它的代码(仅5行):

total = [] 
for i in ['a', 'b', 'c', 'd']: 
    kv = max(a.iterkeys(), key=(lambda key: float(a[key][i]) if i in a[key].keys() else -9.0)) 
    hv = a[kv][i] 
    total.append((kv, i, hv)) 

print total 

输出:

[('2', 'a', '0.7'), ('2', 'b', '0.9'), ('3', 'c', '3'), ('1', 'd', '0.5')] 

-9.0只是一个随机数低。

0

我同意这个问题有点含糊..我建议你不要使用字符串作为值..如果可以在字典中使用int或float,也不指定是否使用python 2.x或3.x

但我认为你是这样的事情以后。

def filter_dict(values): 
    result = collections.Counter() 
    for value in values.keys(): 
     for k, v in values[value].items(): 
      v = float(v) 
      result[k] = v if v > result[k] else result[k] 
    return result 

这是它如何工作:

class FilterDictTest(unittest.TestCase): 
    def test_filter_dict(self): 
     # Arrange 
     actual = { 
      '1': {'a': '0.6', 'b': '0.8', 'c': '2', 'd': '0.5'}, 
      '2': {'a': '0.7', 'b': '0.9', 'c': '0.1', 'd': '0.2'}, 
      '3': {'a': '0.5', 'b': '0.8', 'c': '3'} 
     } 
     expected = { 
      'a': 0.7, 
      'b': 0.9, 
      'c': 3, 
      'd': 0.5 
     } 

     # Act & Assert 
     self.assertEquals(filter_dict(actual), expected) 
0

有点晚了这里。

#!/usr/bin/env python3.5 

# entry 
entry = {'1': {'a': '0.6', 'b': '0.8', 'c': '2','d': '0.5'}, '2': {'a': '0.7', 'b': '0.9', 'c': '0.1','d': '0.2'}, '3': {'a': '0.5', 'b': '0.8', 'c': '3'}} 

# identify keys 
all_categories = [] 

for number, dct in entry.items(): 
    for key, val in dct.items(): 
     all_categories = all_categories + list(dct.keys()) 

all_categories = set(all_categories) 

# Get max values 
max_values = {category:None for category in all_categories} 

for category in all_categories: 
    for number, dct in entry.items(): 
     if category in dct.keys(): 
      if max_values[category] is None: 
       max_values[category] = (number, dct[category]) 
      elif float(max_values[category][1]) < float(dct[category]): 
       max_values[category] = (number, dct[category]) 

output = [(number, category, value) for (category, (number, value)) in max_values.items()] 

print (output) 

输出:

[('2', 'a', '0.7'), ('1', 'd', '0.5'), ('2', 'b', '0.9'), ('3', 'c', '3')] 

不完全是在为了你的预期,但是,如果值是正确的。不过,这不是最优雅的解决方案。

0

我重复第二次在dict来比较值。

values = [] 
for key in d: 
    for skey in d[key]: 
     max = 0 
     _key_ = '' 
     for _ in d: 
      if d[_].has_key(skey): 
       if d[_][skey]>max: 
        max = d[_][skey] 
        _key_ = _ 
     if (_key_, skey, max) not in values: 
      values.append((_key_, skey, max)) 

print values