平均字典的内部列表

Dav*_*vid 0 python python-2.7

假设我有以下字典:

dict_ = {0: {40: [0.692, 0.76, 0.01]}, 1: {33: [0.69, 0.02]}, 2: {39: [0.698, 0.023]}}
Run Code Online (Sandbox Code Playgroud)

我想将内部列表平均在一起,以便生成最终的平均列表,如下所示:[(0.692+0.690.698)/3, (0.76+0.02+0.023)/3, (0.01+0.0+0.0)/3].我的以下代码是:

for i in dict_:
    for j in dict_[i]:
        W = [sum(e) / len(e) for e in zip(*dict_[i][j])]
print(W)
Run Code Online (Sandbox Code Playgroud)

有这个错误:

Traceback (most recent call last):
  File "test.py", line 97, in <module>
    W = [sum(e) / len(e) for e in zip(* dict_[i][j])]
TypeError: zip argument #1 must support iteration
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?任何帮助表示赞赏.

Aja*_*234 7

你可以试试这个:

dict_ = {0: {40: [0.692, 0.76, 0.01]}, 1: {33: [0.69, 0.02]}, 2: {39: [0.698, 0.023]}}
inner_sum = [[sum(c)/float(len(c)) for d, c in b.items()][0] for a, b in dict_.items()]
Run Code Online (Sandbox Code Playgroud)

编辑:您似乎正在尝试压缩内部列表,如果每个列表的长度不相同,请将期望值替换为0:

import itertools
final_data = [[0 if b is None else b for b in i] for i in itertools.izip_longest(*[b.values() for a, b in dict_.items()])][0]
print(final_data)
averages = [sum(i)/float(len(i)) for i in final_data]
print(averages)
Run Code Online (Sandbox Code Playgroud)

输出:

[[0.692, 0.69, 0.698], [0.76, 0.02, 0.023], [0.01, 0, 0]]
[0.6933333333333334, 0.26766666666666666, 0.0033333333333333335]
Run Code Online (Sandbox Code Playgroud)

对于Python3,请zip_longest改用:

final_data = [[0 if b is None else b for b in i] for i in itertools.zip_longest(*[b.values() for a, b in dict_.items()])]
Run Code Online (Sandbox Code Playgroud)

  • 另外,不要在dict_.items()中使用`for a,b',而只需在dict_.values()中使用`for b` (2认同)