2010-11-25 11 views
13

El objeto de devolución se llama None para list.reverse(). Entonces este código falla cuando llamo al solution(k). ¿Hay alguna manera de que pueda moverme haciendo un temporal? ¿O cómo debería hacerlo?list.reverse no devuelve la lista?

fCamel = 'F' 
bCamel = 'B' 
gap = ' ' 

k = ['F', ' ', 'B', 'F'] 

def solution(formation): 
    return ((formation.index(bCamel) > (len(formation) - 1 - (formation.reverse()).index(fCamel)))) 

p.s. Este es mi primer código en Python. Pensé que era funcional.

+0

¿Qué pasa si los elementos que usted está buscando no están en la lista? Quizás si describes lo que estás tratando de hacer, podemos ayudarte a hacer una mejor solución más "pitónica". – GWW

+0

Estoy tratando de resolver ese rompecabezas de camello en python para que pueda aprender el idioma un poco. Básicamente, esta función debería volverse verdadera si todas las 'F's están en el lado izquierdo de la primera' B '. – nakiya

+0

Solo preguntándome. Veo más y más preguntas que permanecen sin upvotes. Esta parece una pregunta interesante, si es simple, para mí. ¿Por qué la gente no vota un poco más por las preguntas? A menudo veo grandes volúmenes de votos para las respuestas, lo que significa que la pregunta al menos tenía el potencial de brindar soluciones o discusiones interesantes, pero no un voto para las preguntas en sí. Me parece extraño (O_O) ¡Saludos! – Morlock

Respuesta

18

Puede usar reversed(formation) para devolver un iterador inverso de formation. Cuando llama al formation.reverse(), realiza una inversión in situ de la lista y devuelve None.

EDIT:

Veo lo que está tratando de hacer ahora, en mi opinión, es más fácil simplemente hacer esto con una lista por comprensión:

def solution(formation): 
    return len([k for k in formation[formation.index(bCamel)+1:] if k == fCamel]) == 0 

Básicamente, esto se ve en todos los elementos después de la primero bCamel y recoge todos los elementos que tienen el valor fCamel. Si esa lista tiene una longitud == 0 tienes una solución.

He aquí algunos ejemplos:

>>> k = ['F','F','B','B','F'] 
>>> solution(k) 
False 
>>> k = ['F','F','B','B','B'] 
>>> solution(k) 
True 
>>> k = ['F','F','B','F','F','B','B'] 
>>> solution(k) 
False 
>>> 
+3

Esto no funcionará en el código no modificado del OP, ya que "revertido" no devuelve una lista, sino un iterador (que no tiene el método "índice"). – rbp

+0

Sí, lo recordé y ajusté mi comentario. Definitivamente tendría que modificar un poco su código para que funcione como él quiere. – GWW

+0

Yo entiendo eso. Pero, hubiera tenido mucho más sentido si devolviera el objeto invertido (¿esto o cómo lo llamas en python?) ¿También está bien? ¿Hay alguna otra función que hace eso? De lo contrario, tendría otro par de líneas :( – nakiya

4

list.reverse invierte in-situ. Es decir:

>>> l = [1, 2, 3] 
>>> l.reverse() 
>>> l 
[3, 2, 1] 

Por favor, consultar el Python documentation, cosas como éstas se presentan allí. También puede probar la 'ayuda' integrada:

ayuda (l.reverse) Ayuda sobre la función integrada de marcha atrás:

inversa (...) L.reverse() - reverso EN LUGAR

5

Para aprovechar la respuesta de GWW, si desea que este código funcione como lo haría, simplemente lo haría list(reversed(formation)). Si realmente quiere ser capaz de utilizar formation.reverse() lugar, tendría que subclase list:

>>> class ReversableList(list): 
...  def reverse(self): 
...   return list(reversed(self)) 
... 
>>> x = ReversableList([1,2,3]) 
>>> x.reverse() 
[3, 2, 1] 

Si es o no es recomendable es otra cuestión, por supuesto.

0

No es muy bonito, pero no encontré el equivalente en las respuestas precedentes. Si la velocidad o los costos de la memoria son bajos (la lista no es muy larga o la operación no se repite una gran cantidad de veces), esto es bastante sencillo e incluso más fácil de leer.

import copy 

fCamel = 'F' 
bCamel = 'B' 
gap = ' ' 

k = ['F', ' ', 'B', 'F'] 

def solution(formation): 
    rev_formation = copy.copy(formation) 
    rev_formation.reverse() 
    return ((formation.index(bCamel) > (len(formation) - 1 - 
      (rev_formation).index(fCamel)))) 

Saludos

14

Puede utilizar rebanar para devolver la lista invertido:

l[::-1] 
+0

sería genial si se pusiera al fin "l = [...]/print (l)/print (l [:: - 1]" –

+2

Esta es la respuesta real a esta pregunta. Devuelve una lista invertida en el lugar para que pueda hacerlo dentro de la lista de comprensiones. –

1

me encontré con este problema y quería aclarar algunas cosas para los usuarios nuevos a pitón procedentes de un javascript fondo.

En javascript, a.reverse() invierte en su lugar y también devuelve la matriz cuando se le llama.

Javascript:

var a = [2, 3 ,4] 
console.log(a.reverse()) 
// outputs [4, 3, 2] 

en Python, a.reverse() invierte en su lugar, pero no devuelve la matriz. Esto es lo que me causó confusión.

en Python:

a = [2, 3, 4] 
a.reverse() 
print(a) 
# outputs [4, 3, 2] 
# can't do print(a.reverse()) 
Cuestiones relacionadas