簡體   English   中英

如何找到重復元素在列表中的位置,然后對這些元素求和?

[英]How to find the position of repeated elements in a list, then sum those elements?

我想在指定的矩陣“ x”中找到列“ 1”和列“ 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的連接為零。

謝謝。

如果引入圖論術語,您的問題將得到澄清。 您的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM