如何在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]]

这是我的清单。我需要标准化这些数据。我试过使用这个代码

a=[(float(i) for i in d) for d in f)/(sum(j) for j in f)]

但我遇到了一个错误。谁能告诉我如何解决这个问题?

埃里克·杜米尼尔

混淆可能来自这样一个事实,即您试图混合两种不同的嵌套列表理解语法。

所有示例都假设您有一个浮点数列表。如果不是这种情况,您可以先转换嵌套列表:

f = [[float(i) for i in j] for j in f]

具有双重理解的扁平列表

第一个返回一个平面列表:

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]

具有双重理解的嵌套列表

第二个返回嵌套列表:

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]]

请注意for i的顺序差异for j

此外,两种语法都为每次迭代计算 sum(j)。

归一化函数

为了避免这种情况,您可以定义一个normalize函数:

def normalize(l):
    s = sum(l)
    return [i/s for i in l]

print([normalize(j) for j in f])

地图和邮编

最后,你可以使用的组合mapzip

sums = map(sum, f)
print([[i/s for i in j] for j,s in zip(f, sums)])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章