How to normalize a list list using list inference in python… here is a solution to the problem.
How to normalize a list list using list inference in python
f = [[7.0, 5.0, 9.0, 7.0], [7.0, 7.0, 8.0, 6.0], [12.0, 6.0, 5.0, 7.0], [5.0, 7.0, 9.0, 9.0], [9.0, 5.0, 6.0, 10.0], [2.0, 0.0, 0.0, 28.0], [0.0, 0.0, 0.0, 30.0], [0.0, 0.0, 0.0, 30.0], [0.0, 30.0, 0.0, 0.0], [2.0, 21.0, 4.0, 3.0], [4.0, 14.0, 11.0, 1.0], [3.0, 4.0, 20.0, 3.0], [0.0, 0.0, 30.0, 0.0], [30.0, 0.0, 0.0, 0.0], [30.0, 0.0, 0.0, 0.0], [30.0, 0.0, 0.0, 0.0], [4.0, 8.0, 5.0, 12.0], [7.0, 6.0, 9.0, 6.0], [5.0, 8.0, 8.0, 5.0], [6.0, 8.0, 2.0, 10.0], [9.0, 3.0, 7.0, 7.0]]
This is my list. I need to normalize this data. I’ve tried using this code
a=[(float(i) for i in d) for d in f)/(sum(j) for j in f)]
But I get an error. Can anyone tell me how to fix this?
Solution
The confusion can come from the fact that you are trying to mix two very different nested lists to understand the syntax.
All examples assume that you have a list of float lists. If this is not the case, you can convert the nested list first:
f = [[float(i) for i in j] for j in f]
Flat list with double understanding
The first one returns a flat list:
f = [[7.0, 5.0, 9.0, 7.0], [7.0, 7.0, 8.0, 6.0], [12.0, 6.0, 5.0, 7.0], [5.0, 7.0, 9.0, 9.0], [9.0, 5.0, 6.0, 10.0], [2.0, 0.0, 0.0, 28.0], [0.0, 0.0, 0.0, 30.0], [0.0, 0.0, 0.0, 30.0], [ 0.0, 30.0, 0.0, 0.0], [2.0, 21.0, 4.0, 3.0], [4.0, 14.0, 11.0, 1.0], [3.0, 4.0, 20.0, 3.0], [0.0, 0.0, 30.0, 0.0], [30.0, 0.0, 0.0, 0.0], [30.0, 0.0, 0.0, 0.0], [30.0, 0.0, 0.0, 0.0], [4.0, 8.0, 5.0, 12.0], [7.0, 6.0, 9.0, 6.0], [5.0, 8.0, 8.0, 5.0], [6.0, 8.0, 2.0, 10.0], [9.0, 3.0, 7.0, 7.0]]
a1 = [i / sum(j) for j in f for i in j]
print(a1)
# [0.25, 0.17857142857142858, 0.32142857142857145, 0.25, 0.25, 0.25, 0.2857142857142857, 0.21428571428571427, 0.4, 0.2, 0.16666666666666666, 0.23333333333333334, 0.16666666666666666, 0.23333333333333334, 0.3, 0.3, 0.3, 0.16666666666666666, 0.2, 0.3333333333333333, 0.06666666666666667, 0.0, 0.0, 0.9333333333333333, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.06666666666666667, 0.7, 0.13333333333333333, 0.1, 0.13333333333333333, 0.4666666666666667, 0.36666666666666664, 0.03333333333333333, 0.1, 0.13333333333333333, 0.6666666666666666, 0.1, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.13793103448275862, 0.27586206896551724, 0.1724137931034483, 0.41379310344827586, 0.25, 0.21428571428571427, 0.32142857142857145, 0.21428571428571427, 0.19230769230769232, 0.3076923076923077, 0.3076923076923077, 0.19230769230769232, 0.23076923076923078, 0.3076923076923077, 0.07692307692307693, 0.38461538461538464, 0.34615384615384615, 0.11538461538461539, 0.2692307692307692, 0.2692307692307692]
Nested lists with double understanding
The second returns a nested list:
a2 = [[i / sum(j) for i in j] for j in f]
print(a2)
# [[0.25, 0.17857142857142858, 0.32142857142857145, 0.25], [0.25, 0.25, 0.2857142857142857, 0.21428571428571427], [0.4, 0.2, 0.16666666666666666, 0.23333333333333334], [ 0.16666666666666666, 0.23333333333333334, 0.3, 0.3], [0.3, 0.16666666666666666, 0.2, 0.3333333333333333], [0.06666666666666667, 0.0, 0.0, 0.9333333333333333], [0.0, 0.0, 0.0, 1.0], [ 0.0, 0.0, 0.0, 1.0], [0.0, 1.0, 0.0, 0.0], [0.06666666666666667, 0.7, 0.13333333333333333, 0.1], [0.13333333333333333, 0.4666666666666667, 0.36666666666666664, 0.03333333333333333], [0.1, 0.13333333333333333, 0.6666666666666666, 0.1], [0.0, 0.0, 1.0, 0.0], [1.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0], [0.13793103448275862, 0.27586206896551724, 0.1724137931034483, 0.41379310344827586], [0.25, 0.21428571428571427, 0.32142857142857145, 0.21428571428571427], [0.19230769230769232, 0.3076923076923077, 0.3076923076923077, 0.19230769230769232], [0.23076923076923078, 0.3076923076923077, 0.07692307692307693, 0.38461538461538464], [0.34615384615384615, 0.11538461538461539, 0.2692307692307692, 0.2692307692307692]]
Note the difference in the order of for i
and for j
.
In addition, both syntaxes calculate sum(j) for each iteration.
Normalization function
To avoid this, you can define a normalize
function:
def normalize(l):
s = sum(l)
return [i/s for i in l]
print([normalize(j) for j in f])
Map and compression
Finally, you can use a combination of map
and zip
:
sums = map(sum, f)
print([[i/s for i in j] for j,s in zip(f, sums)])