def mainCall(nodeGroup):

    maxScore = -9999999
    maxPart = []
    tempPartition = []
    tempScore = 0.0

    for j in range(2, 1+nodes/2):

        nodeGroup = chooseInitPartition(j, nodeGroup)
        tempScore, tempPartition = runKL(edgeList, nodeGroup, rounds)
        print 'temp score', tempScore
        print 'temp part', tempPartition, "\n"
        if(maxScore < tempScore):
            maxScore = tempScore
            maxPart = tempPartition
            print "max score", maxScore
            print "maxpart", maxPart, "\n"

     print 'before ret max part', maxPart
     return maxScore, maxPart

finalScore, finalPartition = mainCall(nodeGroup)


我上面的代码有问题。一切似乎都很好,直到for循环结束为止,但是此后,它打印了maxPart的最后一个值(均代表数字列表),而不是在行print 'before ret max part'上打印tempPartition值。
打印语句确认每次都不满足if条件,尤其是循环中的最后几次运行。所以我看不到tempPartition的值如何转移到maxPart。请帮我解决一下这个。这让我发疯。我确信我缺少一些简单的东西。谢谢!

编辑:

runKL添加代码

def runKL(edgeList, nodeGroup, rounds):

    nodeSwap = [0]*nodes
    maxLogLScore = 0.0
    edgeListLen = len(edgeList)

    networkPartitionStore = []
    logLScores = []

    #Reset count
    count = 0

    #Start main loop
    for i in range(rounds):
        #mark all vertices as unswapped
        for j in range(len(nodeSwap)):
            nodeSwap[j] = 0


        while(count < 100):
            #Choose one edge uniformly randomly
            randNum = random.uniform(0,1)
            edge = edgeList[int(math.floor(edgeListLen*randNum))]
            node1 = int(edge[0]) - 1
            node2 = int(edge[1]) - 1

            if((nodeGroup[node1] == nodeGroup[node2]) or (nodeSwap[node1] == 1) or (nodeSwap[node2] == 1)):
                count += 1
                continue
            else:
                #swap groups among nodes
                temp = nodeGroup[node1]
                nodeGroup[node1] = nodeGroup[node2]
                nodeGroup[node2] = temp

                #mark vertices as swapped
                nodeSwap[node1] = 1
                nodeSwap[node2] = 1

                #calculate likelihood
                logLScore = logLikelihood(edgeList, nodeGroup)
                logLScores.append(logLScore)

                #store network
                networkPartitionStore.append(nodeGroup)

                #reset count value
                count = 0

        #end while loop

        #Choose the index of the maximum likelihood score
        maxLogLScore = max(logLScores)
        index = logLScores.index(maxLogLScore)
        #print 'max score', modularityScores[index]

        #Choose the corresponding network partition i.e. the way the groups have been assigned to the nodes
        nodeGroup = networkPartitionStore[index]

        #Reset partition storage list and modularity scores
        networkPartitionStore = []
        logLScores = []

        #Store initial network partition structure and modularity score.
        networkPartitionStore.append(nodeGroup)
        logLScores.append(maxLogLScore)

    return maxLogLScore, nodeGroup

最佳答案

当你说

maxPart = tempPartition


您不是在创建tempPartition的副本,而是要在创建maxPart时也指向tempPartition指向的相同列表。要真正制作副本,您可以使用像这样的切片符号

maxPart[:] = tempPartition


要么

maxPart = tempPartition[:]


maxPart[:] = tempPartitionmaxPart = tempPartition[:]的区别在于,前者会变异maxPart并将所有值从tempPartition复制到maxPart,后者会创建一个新列表,其中包含tempPartition中所有数据的副本。使maxPart指向新创建的列表。

关于python - 在python中返回了错误的列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20019547/

10-12 02:07