附加当前行数的总和

时间:2014-11-15 04:13:01

标签: python python-3.x

这是我的代码:

def dictListSum(dictionary):
    temporary_list = []
    final_list = []

    for (key, value) in sorted(dictionary.items()):
        temporary_list.append(value[0:])

    nRows = len(temporary_list)
    nCols = len(temporary_list[0])

    for row in range(0, nRows-1):
        for col in range(0, nCols):
            final_list.append(temporary_list[row][col] + temporary_list[row + 1][col])

    return final_list

我遇到与此问题有关的问题:

final_list.append(temporary_list[row][col] + temporary_list[row + 1][col])

这是我期望用户词典输入的格式:

a = {'A': [3, 11, 2], 'B': [5, 2, 0]}

现在,如果用户的字典只有两个键,代码就可以正常运行。当用户输入如下内容时,我的问题就开始出现了:

a = {'A':[4, 5, 2, 5, 6, 3], 'B': [4, 5, 6, 2, 4, 6], 'C': [1, 1, 1, 1, 1, 1,], 'D': [2, 2, 2, 2, 2, 2]}

如果是这种情况,我麻烦的代码行必须如下所示:

final_list.append(temporary_list[row][col] + temporary_list[row + 1][col] temporary_list[row + 2][col] temporary_list[row + 3][col])

那么,我如何能够以顺序格式将所有行(列表存在)一起添加? 请记住,用户可以创建他/她想要的密钥,只要它们具有相同的长度并且是列表格式。

一个错误的示例输出(使用后一个字典):

a = {'A':[4, 5, 2, 5, 6, 3], 'B': [4, 5, 6, 2, 4, 6], 'C': [1, 1, 1, 1, 1, 1,], 'D': [2, 2, 2, 2, 2, 2]}
dictListSum(a)

[8, 10, 8, 7, 10, 9, 5, 6, 7, 3, 5, 7, 3, 3, 3, 3, 3, 3]

会发生什么:

dictListSum(a)

[11, 13, 11, 10, 13, 12]

1 个答案:

答案 0 :(得分:4)

考虑这一点的一种方法:将字典的值视为表的行,然后沿列求和。即转换它:

[4, 5, 2, 5, 6, 3],
[4, 5, 6, 2, 4, 6],
[1, 1, 1, 1, 1, 1],
[2, 2, 2, 2, 2, 2]

到此:

[4, 4, 1, 2],
[5, 5, 1, 2],
[6, 2, 1, 2],
[2, 5, 1, 2],
[4, 6, 1, 2],
[6, 3, 1, 2]

...然后对列表求和。为此:

[sum(lst) for lst in zip(*a.values())]

zip(*lists)是一种基本上等同于“转置”“矩阵”的模式;然后,我们只是按每个“行”(lst)求和。