如何在列表中找到重复元素的位置,然后对这些元素求和?

时间:2016-06-17 22:21:25

标签: python list

我想在列“1”中找到重复元素的位置,在指定矩阵“x”中找到列“2”(矩阵“x”具有nx3大小(“n”是最大数字)在列“1”和列“2”之间,在下一个例子中是max(3,4)= 4)),然后在新矩阵“z”的主对角线(数字1到“n”)中(矩阵“z”具有“n”x“n”大小)对每列的值(除了具有等于零的值的列除外)的总和,并将相应的值放在相应列中的非对角线上。这是矩阵“x”的一个例子:

        1 2 3
x=  1 [[1,2,4],
    2  [1,3,2],
    3  [2,3,1],
    4  [3,4,5]]

矩阵“z”是对称矩阵,意味着例如元素z [1,2]等于z [2,1]并且元素z [1,3]等于z [3,1]这是矩阵“z”的结构:

z=  [[z[1],z[1 to 2],z[1 to 3],z[1 to 4]], 
     [z[2 to 1],z[2],z[2 to 3],z[2 to 4]], 
     [[z[3 to 1],z[3 to 2],z[3],z[3 to 4]],
     [[z[4 to 1],z[4 to 2],z[4 to 3],z[4]]

对角线主体中的元素(对于此示例是):

 z[1]=z[1 to 2]+z[1 to 3]+z[1 to 4]
 z[2]=z[2 to 1]+z[2 to 3]+z[2 to 4]
 z[3]=z[3 to 1]+z[3 to 2]+z[3 to 4]
 z[4]=z[4 to 1]+z[4 to 2]+z[4 to 3]

所需的矩阵(对于此示例)是:

z=  [[4+2=6,4,2,0], 
     [4,4+1=5,1,0], 
     [2,1,2+1+5=8,5],
     [0,0,5,5]]

注意:矩阵“z”中的零表示是否与其他数字没有关联。在此示例中,数字“4”仅与数字“3”连接(值为5)。然后,数字4与数字1和数字2的连接为零。

感谢。

1 个答案:

答案 0 :(得分:0)

如果您引入图论理论术语,您的问题就会得到澄清。您的x可以被视为描述加权图。像[1,3,2]这样的行可以解释为描述连接节点1和节点3的权重2的边缘的存在。矩阵z包含以下信息:

1)对于每个节点i,相应的对角线条目是与i一起发生的所有边的权重之和。

2)对于每对不同的节点ij,如果节点未连接,则z的相应条目为0,或者权重为连接ij的边(如果有的话)(如果有多个边,则为权重的总和)。

鉴于这种解释,事情很容易。以下假设x中的节点以1开头。请注意,即使图形从1开始,结果矩阵也是从0开始的,因此要查找从节点2到节点3的权重,您需要z[1][2]

def makeMatrix(edges):
    n = max(max(edge[:2]) for edge in edges)
    z = [[0]*n for i in range(n)]
    for edge in edges:
        i,j,w = edge
        z[i-1][i-1] += w
        z[j-1][j-1] += w
        z[i-1][j-1] += w
        z[j-1][i-1] += w
    return z

以下有助于调试:

def pprint(matrix):
    for row in matrix:
        print(' '.join(str(i) for i in row))

例如,

>>> x = [[1,2,4],[1,3,2],[2,3,1],[3,4,5]]
>>> z = makeMatrix(x)
>>> pprint(z)
6 4 2 0
4 5 1 0
2 1 8 5
0 0 5 5