<pre><code>def rank_by_value(list_dicts):
from operator import itemgetter
from itertools import groupby
nums = []
symbs = []
# separting keys, values into two lists
# one for numeric values, the other for string values
for indx, d in enumerate(list_dicts):
for k, val in d.items():
if type(val) in (int,float):
nums.append((indx,k,val))
else:
symbs.append((indx,{k:val}))
groups = []
# grouping lists
for k, g in groupby(nums, key=itemgetter(0)):
groups.append(list(g))
allData = []
# sorting lists by by each dictionry values and assinging ranks
for g in groups:
sort_ed = sorted(g, key=itemgetter(2), reverse=True)
ranked = [ list((t,i+1)) for i,t in enumerate(sort_ed)]
allData.append(ranked)
ranked = []
# remove numerical data
for zero in allData:
for i, el in enumerate(zero):
one,two, _ = el[0]
zero[i] = one,(two, el[1])
# now creating dictionaries anew
list_of_dict = []
dict_temp = {}
for i, (el, sy) in enumerate(zip(allData, symbs)) :
for l in el:
name_, rank_ = l[1]
dict_temp[name_] = rank_
dict_temp.update(symbs[i][1])
list_of_dict.append(dict_temp)
dict_temp = {}
return list_of_dict
for el in rank_by_value(jsn):
print(el)
{'TCI': 3, 'YCSI': 1, 'naziv': 'HDZ', 'YCI': 5, 'FCI': 4, 'TFCI': 2}
{'TCI': 4, 'YCSI': 1, 'naziv': 'HNS', 'YCI': 5, 'FCI': 3, 'TFCI': 2}
{'TCI': 2, 'YCSI': 3, 'naziv': 'HSP AS', 'YCI': 4, 'FCI': 5, 'TFCI': 1}
{'TCI': 3, 'YCSI': 1, 'naziv': 'HSS', 'YCI': 2, 'FCI': 4, 'TFCI': 5}
</code></pre>