¿Cómo puedo obtener una copia invertida de una lista (evitar una declaración separada al encadenar un método después de .reverse)?
Este código falla:
fCamel = 'F'
bCamel = 'B'
gap = ' '
k = ['F', ' ', 'B', 'F']
def solution(formation):
return ((formation.index(bCamel) > (len(formation) - 1 - (formation.reverse()).index(fCamel))))
solution(k)
Recibo una excepción que dice AttributeError: 'NoneType' object has no attribute 'index'
.
Sé que el problema es que list.reverse()
regresaNone
, modificando la lista en el lugar. Quiero usar .index
en la lista invertida. ¿Hay alguna manera de evitar el uso de una declaración separada para invertir la lista antes de indexarla? ¿Cómo?
Puede utilizar el corte para devolver la lista invertida:
l[::-1]
Puede utilizar reversed(formation)
para devolver un iterador inverso de formation
. Cuando lo llama formation.reverse()
, realiza una inversión in situ de la lista y devuelve Ninguno.
EDITAR:
Veo lo que estás intentando hacer ahora. En mi opinión, es más fácil 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 analiza todos los elementos después del primero bCamel
y recopila todos los elementos que tienen el valor fCamel
. Si esa lista tiene una longitud == 0, tienes una solución.
A continuación se muestran 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
>>>
Para aprovechar la respuesta de GWW, si desea que este código funcione como está, simplemente debe hacerlo list(reversed(formation))
. Si realmente quieres poder usarlo formation.reverse()
, tendrías que crear una subclase list
:
>>> class ReversableList(list):
... def reverse(self):
... return list(reversed(self))
...
>>> x = ReversableList([1,2,3])
>>> x.reverse()
[3, 2, 1]
Si esto es aconsejable o no es, por supuesto, otra cuestión.
list.reverse se invierte en su lugar. Eso es:
>>> l = [1, 2, 3]
>>> l.reverse()
>>> l
[3, 2, 1]
Consulte la documentación de Python , cosas como estas se describen allí. También puedes probar la 'ayuda' incorporada:
ayuda(l.reverse) Ayuda sobre la función incorporada inversa:
revertir(...) L.reverse() -- revertir EN SU LUGAR
Me acabo de encontrar con este problema y quería aclarar algunas cosas para los usuarios nuevos en Python que tienen experiencia en JavaScript.
En javascript, a.reverse() invierte su lugar y también devuelve la matriz cuando se llama.
JavaScript:
var a = [2, 3 ,4]
console.log(a.reverse())
// outputs [4, 3, 2]
console.log(a)
// outputs [4, 3, 2]
En Python, a.reverse() invierte su lugar, pero no devuelve la matriz. Esto es lo que me causó confusión.
En pitón:
a = [2, 3, 4]
a.reverse()
print(a)
# outputs [4, 3, 2]
# can't do print(a.reverse())