2017-06-21 50 views
1
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]] 

这是我的列表。我需要规范化这些数据。我试过使用此代码如何在Python中使用列表理解来标准化列表列表

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

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

+2

更改到'[f中以J [浮子(I)/总和(J)对于i]对于j]'。 – saruftw

回答

1

的混乱可能来自一个事实,即你想将两种不同的,嵌套列表理解语法。

所有的例子都假设你有一个浮点列表。如果不是的话,你可以先转换您的嵌套列表:

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 ifor j

此外,两种语法都计算每次迭代的总和(j)。

正常化功能

为了避免这种情况,你可以定义一个normalize功能:

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

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

地图和zip

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

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

我尝试过ur代码,但我得到错误TypeError:不支持的操作数类型为+:'int'和'str' – prilinsh

+0

@prilinsh:这意味着您的列表中有多种对象类型。在你的例子列表中,你有一个浮动列表列表。没有整数或字符串。 –

0

试试这个:

from __future__ import division #to avoid integer division 
normalized_list = [[a/sum(el) for a in el] for el in f] 
+1

为什么师需要?在任何地方都没有整数。 –

+5

轻微挑剔:每次迭代计算'sum(el)'。 –

+0

@ Jean-FrançoisFabre避免这将需要一个循环,这也是好的。我不认为你可以通过列表理解 –

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

的这相当于:

res = [] 
for d in f : 
    res1 =[] 
    for i in d: 
     res1.append(float(i)/sum(d)) 
    res.append(res1) 
+0

在这个答案是不同于以前的? –

+0

@EricDuminil为什么不等同? –

+0

@EricDuminil编辑 –

0

你有一个语法错误。

我会首先尝试遍历列表,看它是否按预期工作。

for i in f: 
    print [float(j)/sum(i) for j in i] 

您也可以这样做:

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

在这个答案是不同于以前的? –