Christos Baziotis - 7 months ago 23

Python Question

I have a list of dictionaries and each dictionary contains exactly the same keys. I want to find the average value for each key and I would like to know how to do it using reduce (or if not possible with another more elegant way than using nested

`for`

Here is the list:

`[`

{

"accuracy": 0.78,

"f_measure": 0.8169374016795885,

"precision": 0.8192088044235794,

"recall": 0.8172222222222223

},

{

"accuracy": 0.77,

"f_measure": 0.8159133315763016,

"precision": 0.8174754717495807,

"recall": 0.8161111111111111

},

{

"accuracy": 0.82,

"f_measure": 0.8226353934130455,

"precision": 0.8238175920455686,

"recall": 0.8227777777777778

}, ...

]

I would like to get back I dictionary like this:

`{`

"accuracy": 0.81,

"f_measure": 0.83,

"precision": 0.84,

"recall": 0.83

}

Here is what I had so far, but I don't like it:

`folds = [ ... ]`

keys = folds[0].keys()

results = dict.fromkeys(keys, 0)

for fold in folds:

for k in keys:

results[k] += fold[k] / len(folds)

print(results)

Answer

As an alternative, if you're going to be doing such calculations on data, then you may wish to use pandas (which will be overkill for a one off, but will greatly simplify such tasks...)

```
import pandas as pd
data = [
{
"accuracy": 0.78,
"f_measure": 0.8169374016795885,
"precision": 0.8192088044235794,
"recall": 0.8172222222222223
},
{
"accuracy": 0.77,
"f_measure": 0.8159133315763016,
"precision": 0.8174754717495807,
"recall": 0.8161111111111111
},
{
"accuracy": 0.82,
"f_measure": 0.8226353934130455,
"precision": 0.8238175920455686,
"recall": 0.8227777777777778
}, # ...
]
result = pd.DataFrame.from_records(data).mean().to_dict()
```

Which gives you:

```
{'accuracy': 0.79000000000000004,
'f_measure': 0.8184953755563118,
'precision': 0.82016728940624295,
'recall': 0.81870370370370382}
```