<pre><code>import six
raw_object = [
{
"YCI": 0.014076729909151329,
"TCI": 0.5610661498232027,
"FCI": 0.327632092582722,
"TFCI": 3.04906430661623,
"naziv": "HDZ",
"YCSI": 14.49723089452966
},
{
"YCI": 0.04249999676677044,
"TCI": 0.33129318126147167,
"FCI": 1.677073944380761,
"TFCI": 4.326953034001479,
"naziv": "HNS",
"YCSI": 56.80909574468085
},
{
"YCI": 0,
"TCI": 0.40603351151808614,
"FCI": 0,
"TFCI": 12.61045547126369,
"naziv": "HSP AS",
"YCSI": 0
},
{
"YCI": 2.231205214448367,
"TCI": 0,
"FCI": 0,
"TFCI": 0,
"naziv": "HSS",
"YCSI": 949.343111111111
}
]
#make a list (equal in length to original object) of empty dictionaries
ranks_object = [{} for i in raw_object]
#iterate through each key in the first dictionary
#(I assumed that all dictionaries will have the same keys)
for key in raw_object[0]:
#create a list with the value for this key from all dictionaries
raw_list = [group[key] for group in raw_object]
#sort and store the list
sorted_raw_list = sorted(raw_list)
#create a list of the ranks of each of the raw values
#if the value is greater than zero, a value's rank is the length
# of the raw list minus the index of the value in the sorted list
#otherwise, the rank should be 0 (as indicated by OP's desired output)
ranks = [len(raw_list) - sorted_raw_list.index(value) if value > 0 else 0 for value in raw_list]
#iterate through each rank in the ranks list (with access to the
# list index, which will be used to make sure that the rank is
# inserted into the proper dictionary)
for index, rank in enumerate(ranks):
#if the value for the key in the first dictionary is a string,
# insert the original value with the key
#(I assumed that if one dictionary has a string value for a
# certain key, all of the dictionaries do as well)
if isinstance(raw_object[0][key], six.string_types):
ranks_object[index][key] = raw_object[index][key]
#otherwise insert the rank with the key
else:
ranks_object[index][key] = rank
#display each rank dictionary separately to improve readability
for x in ranks_object:
print x
</code></pre>