2015-12-30 184 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