Frage list.reverse gibt keine Liste zurück?


Das Rückgabeobjekt wird benannt None zum list.reverse(). Dieser Code schlägt also fehl, wenn ich anrufe solution(k). Gibt es eine Möglichkeit, wie ich es schaffen kann, eine temporäre Arbeit zu machen? Oder wie soll ich das machen?

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. Dies ist mein erster Code in Python. Ich dachte, es wäre funktional.


13
2017-11-25 20:39


Ursprung


Antworten:


Sie können verwenden reversed(formation) einen umgekehrten Iterator von zurückgeben formation. Wenn du anrufst formation.reverse() Es führt eine Umkehrung der Liste durch und gibt None zurück.

BEARBEITEN:

Ich sehe, was Sie jetzt versuchen, meiner Meinung nach ist es einfacher, dies mit einem Listenverständnis zu tun:

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

Dies betrachtet grundsätzlich alle Elemente nach dem ersten bCamel und sammelt alle Elemente, die den Wert haben fCamel. Wenn diese Liste eine Länge == 0 hat, haben Sie eine Lösung.

Hier ein paar Beispiele:

>>> 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
>>> 

18
2017-11-25 20:40



Sie können Slicing verwenden, um die umgekehrte Liste zurückzugeben:

l[::-1]

15
2017-09-25 00:18



Um auf der Antwort von GWW aufzubauen, wenn Sie möchten, dass dieser Code so funktioniert, wie Sie es gerade tun würden list(reversed(formation)). Wenn du wirklich in der Lage sein willst zu benutzen formation.reverse() stattdessen müssten Sie eine Unterklasse erstellen list:

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

Ob das ratsam ist oder nicht, ist natürlich eine andere Frage.


5
2017-11-25 20:50



list.reverse kehrt Inplace um. Das ist:

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

Bitte konsultieren Sie die Python-DokumentationDinge wie diese sind dort angelegt. Sie können auch die integrierte Hilfe ausprobieren:

help (l.reverse) Hilfe zur eingebauten Funktion reverse:

umkehren(...)       L.reverse () - rückwärts AN ORT UND STELLE


4
2017-11-25 20:42



Ich bin gerade auf dieses Problem gestoßen und wollte einige Dinge für Benutzer, die neu in Python sind, erklären, die von einem Javascript-Hintergrund kommen.

In JavaScript kehrt a.reverse () zurück und gibt das Array auch zurück, wenn es aufgerufen wird.

Javascript:

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

In Python, a.reverse () kehrt die Stelle um, gibt aber das Array nicht zurück. Das hat mich verwirrt.

In Python:

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

1
2018-02-10 21:41



Nicht super schön, aber ich fand das Äquivalent in den vorhergehenden Antworten nicht. Wenn die Geschwindigkeit oder die Speicherkosten niedrig sind (die Liste ist nicht sehr lang oder die Operation wird nicht sehr oft wiederholt), ist dies ziemlich einfach und noch einfacher zu lesen.

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))))

Prost


0
2017-11-25 21:09



Dies bietet keine Lösung für das F_BF-Musterproblem, aber Es behandelt das Problem, dass Python keine Liste zurückgibt wenn Sie .reverse () verwenden.

So habe ich es verstanden:

chars = ['a', '-', 'c']
chars2 = [] + chars
chars2.reverse()
totalChars = chars + chars2

totalChars gibt a-cc-a zurück, was ich wollte, UND chars2 ist eine Liste, kein Zeiger auf Zeichen. Hoffe das hilft.


0
2017-08-02 02:56