2010-11-25 16 views
13

Das Rückgabeobjekt heißt None für list.reverse(). So schlägt dieser Code fehl, wenn ich solution(k) rufe. Gibt es eine Möglichkeit, wie ich es schaffen kann, eine temporäre Arbeit zu machen? Oder wie soll ich das machen?list.reverse gibt keine Liste zurück?

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.

+0

Was die Elemente passiert, wenn Sie nicht in der Liste suchen sind? Vielleicht, wenn Sie beschreiben, was Sie versuchen, können wir Ihnen helfen, eine bessere "pythonische" Lösung zu machen. – GWW

+0

Ich versuche das Kamelrätsel in Python zu lösen, damit ich die Sprache ein wenig lernen kann. Grundsätzlich sollte diese Funktion wahr sein, wenn sich alle 'F' auf der linken Seite des ersten 'B' befinden. – nakiya

+0

Ich frage mich nur. Ich sehe mehr und mehr Fragen, die ohne Upvotes bleiben. Das scheint mir eine interessante, wenn auch einfache Frage zu sein. Warum wählen die Leute nicht ein bisschen mehr für Fragen? Ich sehe oft große Stimmenzahlen für die Antworten, was bedeutet, dass die Frage zumindest das Potenzial hatte, interessante Lösungen oder Diskussionen zu bringen, aber nicht eine Stimme für die Fragen selbst. Scheint seltsam für mich (O_O) Prost! – Morlock

Antwort

18

Sie können reversed(formation) verwenden, um einen umgekehrten Iterator formation zurückzugeben. Wenn Sie formation.reverse() aufrufen, wird eine Umkehrung der Liste durchgeführt und None zurückgegeben.

EDIT:

Ich sehe, was du jetzt zu tun versuchen, meiner Meinung nach ist es einfacher, nur dieses Verständnis mit einer Liste zu tun:

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

Das alles sieht grundsätzlich an den Elementen nach dem erste bCamel und sammelt alle Elemente mit dem Wert 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 
>>> 
+3

Dies funktioniert nicht mit dem unmodifizierten Code des OPs, da "reversed" keine Liste zurückgibt, sondern einen Iterator (der nicht über die Methode "index" verfügt). – rbp

+0

Ja, ich erinnerte mich daran und korrigierte meinen Kommentar. Er müsste seinen Code definitiv ändern, damit er so funktioniert, wie er es möchte. – GWW

+0

Ich verstehe das. Aber, es hätte viel mehr Sinn gemacht, wenn es das umgekehrte Objekt zurückgibt (das oder was nennst du es in Python?) Auch richtig? Gibt es eine andere Funktion, die das tut? Sonst hätte ich noch ein paar Zeilen :( – nakiya

4

list.reverse kehrt Inplace. Das heißt:

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

Bitte beachten Sie die Python documentation, Dinge wie diese werden dort angelegt. Sie können auch versuchen, die 'Hilfe' eingebaut:

Hilfe (l.reverse) Hilfe zur integrierten Funktion umgekehrt:

reverse (...) L.Reverse() - umgekehrt PLATZIEREN

5

Um auf der Antwort von GWW aufzubauen, wenn Sie möchten, dass dieser Code so funktioniert wie Sie möchten, würden Sie einfach list(reversed(formation)) tun. Wenn Sie wirklich in der Lage sein wollen, anstatt formation.reverse() zu verwenden, würden Sie haben list Unterklasse:

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

Ob dies empfiehlt sich eine andere Frage ist natürlich.

0

Nicht super schön, aber ich fand nicht das Äquivalent in den Präzedenzfällen Antworten. 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

14

Sie schneiden können die umgekehrte Liste zurückzukehren:

l[::-1] 
+0

wäre toll, wenn zuletzt "l = [...]/print (l)/print (l [:: - 1]" –

+2

Dies ist die echte Antwort zu dieser Frage.Es gibt eine umgekehrte Liste an Ort und Stelle, so dass Sie es innerhalb der Listenergänzungen tun können. –

1

ich auf dieses Problem nur kam und wollte von einem Javascript einige Dinge für die Benutzer neu zu Python klären kommen Hintergrund.

In JavaScript kehrt a.reverse() um und gibt auch das Array 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 an Ort und Stelle, ist aber nicht das Array 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()) 
Verwandte Themen