python - 为何在这种情况下max()函数不能使用?
怪我咯
怪我咯 2017-04-18 09:22:28
0
2
1046
class LongestIncreasingSubsequence:
    def getLIS(self, A, n):
        # write code here
        dp=[0 for i in range(n)]
        dp[0]=1
        max=0
        print dp
        for i in range(n):
            now=0
            if i!=0:
                res=1
                for j in range(i):
                    if A[i]>A[j]:
                        res=dp[j]
                        now=now +1
                if now>=max:
                    max=now
                    dp[i]=res+1
                else:
                    dp[i]=res
        print dp
        #return max(dp)

kk=LongestIncreasingSubsequence()
kk.getLIS([1,4,2,5,3],5)

其中dp 是一个以int类型为成员的list
而使用max()函数时却会报错
TypeError: 'int' object is not callable
是由什么原因导致的?

怪我咯
怪我咯

走同样的路,发现不同的人生

répondre à tous(2)
PHPzhong

Votre fonction max reçoit une valeur de 0 dans la cinquième ligne. La fonction max est écrasée. Renommez votre variable afin qu'elle n'ait pas le même nom que la fonction de bibliothèque

.
伊谢尔伦

La raison est que, comme @rayleisure l'a dit, vous utilisez max ici comme référence à une variable de type int, ce qui donne

return max(dp)

provoque non seulement l'échec de la fonction intégrée, mais provoque également :

TypeError: 'int' object is not callable

C'est parce que vous avez appelé l'entier max,

En bref, pensez à nommer les variables qui ne correspondent pas :

  1. mots clés

  2. Fonctions intégrées

  3. Le nom de la bibliothèque standard ou de tout package/module utilisé

Même nom.

Digression

Les éléments suivants sont hors sujet

  1. À en juger par votre code actuel, il semble que vous n'ayez besoin que d'écrire une fonction. Écrire cette classe semble redondant (à moins que vous ne fassiez une banque de questions en ligne ?)

  2. Il n'est pas nécessaire de transmettre spécifiquement la longueur de la liste. Demander la longueur de la liste en Python peut être facilement effectué avec len()

  3. .
  4. Pour le problème LIS, j'ai simplifié votre code :

Trouver uniquement la longueur de LIS :

def lislength(lst):
    """O(n^2) by button-up method"""
    n = len(lst)
    dp = [1 for x in lst]
    for i in range(n):
        for j in range(i+1, n):
            if lst[j] > lst[i]:
                dp[j] = max(dp[j], dp[i]+1)
    return max(dp)

Le LIS tout entier réclame sa sortie :

def lis(lst):
    """O(n^2) by button-up method"""
    # use prev to record the previous elements
    n = len(lst)
    dp = [1 for x in lst]
    prev = [-1 for x in lst]
    for i in range(n):
        for j in range(i+1, n):
            if lst[j] > lst[i]:
                if dp[i]+1 > dp[j]:
                    prev[j] = i
                    dp[j] = dp[i]+1
    # find last elements of LIS
    maxl = maxpos = 0
    for pos, l in enumerate(dp):
        if l > maxl:
            maxl, maxpos = l, pos
    # trace back to find LIS
    seq = []
    while maxpos >= 0:
        seq.append(lst[maxpos])
        maxpos = prev[maxpos]
    seq.reverse()
    return seq

Test :

print(lislength([4,5,6,7,1,2,3,9]))
print(lis([4,5,6,7,1,2,3,9]))
print(lislength([1,3,6,7,4,5,9,10,15,12,14]))
print(lis([1,3,6,7,4,5,9,10,15,12,14]))

Résultat :

5
[4, 5, 6, 7, 9]
8
[1, 3, 6, 7, 9, 10, 12, 14]

Questions auxquelles j'ai répondu : Python-QA

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!