¿Cómo puedo obtener una copia invertida de una lista (evitar una declaración separada al encadenar un método después de .reverse)?

Resuelto nakiya asked hace 13 años • 11 respuestas

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 .indexen la lista invertida. ¿Hay alguna manera de evitar el uso de una declaración separada para invertir la lista antes de indexarla? ¿Cómo?

nakiya avatar Nov 26 '10 03:11 nakiya
Aceptado

Puede utilizar el corte para devolver la lista invertida:

l[::-1]
Leon avatar Sep 25 '2013 00:09 Leon

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 bCamely 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
>>> 
GWW avatar Nov 25 '2010 20:11 GWW

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.

Jason Baker avatar Nov 25 '2010 20:11 Jason Baker

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

rbp avatar Nov 25 '2010 20:11 rbp

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())
Cisco G avatar Feb 10 '2018 21:02 Cisco G