[Python-es] Problema raro en if (): else: en python WTF???

José Sabater Montes jsm en iaa.es
Vie Ago 24 13:29:54 CEST 2012


El 23/08/2012, a las 15:05, Horacio escribió:

> Buenas, este problema me desafía todo mi sentido común... lo que busco
> en una matriz A de NRxNR es hallar las codiagonales no nulas y su
> longitud..
> 
> AVISO: Este algoritmo funciona, lo he probado en PERL!!
> 
> Pero el siguiente código no se por qué LM y S se mantienen en cero???
> luego del ELSE: cuando s+=1 si se incrementa en 1!! como lo compruebo
> en el primer "print"  WTF!!!
> 
> d=[]
> d=[0]*NR
> LM=0
> s=0
> for c in range(5,NR):
>   s=0
>   for x in range(NR):
>       y=x+c
>       if (y<NR):
>           if (A[x][y]==1):
>               s+=1
>               print s # aca da <> 0
>           else:
>               print s,LM # aca me da s=LM=0 ???? el equivalente en
> perl me da <> 0??? WTF
>               if (s>LM):
>                   LM=s
>               d[s]+=1
>               s=0
> print "Diagonal maxima %d" % LM
> 
> Alguien me puede decir que cuernos le pasa al if??

Si lo que quieres es escribir tu propio algoritmo puedes ignorar todo el mensaje pero, si pudieras trabajar con numpy...

puedes encontrar la diagonal con
numpy.diagonal(a)

Si las codiagonales son las diagonales adyacentes a la diagonal principal (no sé cual es la definición exacta) puedes encontrarlas "recortando" tu matriz para convertirlas en las diagonales de las matrices "recortadas".
Codiagonal superior
cs = numpy.diagonal(a[:,1:])
Codiagonal inferior
ci = numpy.diagonal(a[1:,:])

Si lo que quieres es ver si son todo ceros puedes hacer
not cs.any()

Si lo que quieres es contar el número de elementos que no son cero puedes obtenerlos así
cs[cs != 0]
y contarlos con 
len(cs[cs != 0])

Aparte del ahorro en escribir algoritmos tengo la sensación de que sería más eficiente para matrices grandes. 

Un saludo



Más información sobre la lista de distribución Python-es