2016-10-27 2 views
0

Der group_when Generator nimmt ein iterables und ein Prädikat als Parameter: es erzeugt Listen, die jeweils in einem Wert aus dem iterablen enden, wo das Prädikat True ist. Wenn der iterable auf einem Wert endet, für die das Prädikat false zurückgibt, ergeben eine endgültige Liste alle Werte von dem einen nach dem vorherigen Ende mit dem letzten Wert enthält, von der iterable erzeugtFunktion nimmt Iterabls und gibt eine Liste zurück

zum Beispiel:

for i in group_when('combustibles', lambda x : x in 'aeiou'): 
    print(i,end='') 

druckt die 5 Listen ['c', 'o'] ['m', 'b', 'u'] ['s', 't', 'i'] ['b', 'l', ' e '] [' s '].

meine Funktion wird so nah an der richtigen Antwort. wenn der Eingang

('combustibles', lambda x : x in 'aeiou') 

meine Funktion kehrt

[['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e']] 

aber das sollte korrekt ausgegeben werden:

[['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e'], ['s']] 

Deshalb ich nur fehle den letzten Buchstaben 's'. kann mir jemand sagen, wie man es repariert? vielen Dank

posted ich den Fehler, den ich unten habe nur helfen Sie meine Funktion zu verstehen:

26 *Error: Failed [v for v in group_when('combustibles', lambda x : x in 'aeiou')] == [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e'], ['s']] 
     evaluated: [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e']] == [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e'], ['s']] 
27 *Error: Failed [v for v in group_when(hide('combustibles'), lambda x : x in 'aeiou')] == [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e'], ['s']] 
     evaluated: [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e']] == [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e'], ['s']] 
+2

anstelle von 'while' verwenden' for'-Schleife. Ruf 'p (y)' nur einmal an. – Daniel

+0

Ich bin mir nicht 100% sicher, aber brauchst du kein letztes d.append (z)? – bravosierra99

+0

plus das ist nicht wirklich ein Generator richtig? Damit es ein Generator ist, sollte es "Ausbeute" verwenden. Ich bin sicherlich kein Experte für sie, aber ich dachte, das war immer der Fall. – bravosierra99

Antwort

1

Also gehen Sie mit Ihrem ursprünglichen Formular, das ist, wie ich Ihr Problem beheben würde.

def group_when(iterable,p): 
    x = iter(iterable) 
    z = [] 
    d = [] 
    for y in x: 
     z.append(y) 
     if p(y): 
      d.append(z) 
      z = [] 
    if z: 
     d.append(z) 
    return d #added the d here, think OP dropped it by accident 
+0

hat es funktioniert. Danke – zhangdi

+0

Sie sind herzlich willkommen! Und danke, dass du die Antwort akzeptierst. Obwohl ich Ihnen sagen werde, dass dies kein Generator zu sein scheint und leicht in einen verwandelt werden könnte! Sie könnten das mit dem Befehl yield machen. Du könntest anstelle von 'd.append (z)' 'z 'ergeben und ich glaube, es würde als Generator funktionieren. – bravosierra99

+0

@ bravosierra99 Wo geben Sie die Werte zurück? Fehle ich etwas? – Shasha99

1

Das Problem ist, dass Sie nur z zu d hinzufügen, wenn Sie ein Prädikat erhalten. Wenn also die Zeichenfolge nicht mit einem Prädikat endet, wird z ein letztes Mal nicht hinzugefügt. Sie müssen also am Ende irgendwo:

if z: 
    d.append(z) 

Dies fügt z nur, wenn es nicht leer ist. Aber Ihr Code fehlt yield oder die tatsächliche return Aussage, so dass ich nicht sicher bin, wo dies geschehen sollte.

Auch müssen Sie nicht direkt mit den booleans vergleichen. In der Tat könnten Sie Folgendes tun:

if p(y): 
    z.append(y) 
    d.append(z) 
    z = [] 
else: 
    z.append(y) 
1

Sie Code wird falsches Ergebnis geben, wenn das Prädikat Falsch für letzte Element in Iterator zurückgibt.

z wird nicht an d angehängt, wenn p (y) für letzte y in iterable Falsch ist. Sie sollten diesen Fall behandeln.

Code erweitern und fügen Sie 2 weitere Linien nach außer wie unten erwähnt:

except StopIteration: 
     pass 
if len(z) !=0: 
    y.append(z) 

Sie können den folgenden Code verwenden, um die gleiche Arbeit tun:

def group_when(iterable,p): 
    z = [] 
    d = [] 

    for y in iterable: 
     z.append(y) 
     if p(y) is True: 
      d.append(z) 
      z=[] 
    if z: 
     d.append(z) 
    return d 

Nach ist die Generatorversion Ihres Codes:

def group_when(iterable,p): 
    z = [] 
    for y in iterable: 
     z.append(y) 
     if p(y) is True: 
      yield z 
      z=[] 
    if z : 
     yield z 
    return 
+0

keine schlechte Lösung, aber die 'len (z)' ist unnötig. 'Wenn z:' '' False' zurückgibt, wenn es die leere Liste '[]' – bravosierra99

+0

yea Ich sehe, dass Sie das 'd' hinzugefügt habe ich wette das ist, was sein Code tatsächlich hat ... – bravosierra99

+0

@ bravosierra99, Ja, Sie sind richtig. Keine Notwendigkeit für len() – Shasha99

Verwandte Themen