Ich mache ein Parsing, das einen Lookahead-Token benötigt. Was ich möchte, ist eine schnelle Funktion (oder Klasse?), Die einen Iterator nehmen und in eine Liste von Tupeln in der Form (Token, Lookahead) verwandeln würde, so dass:
%Vor%Im Grunde wäre das praktisch, um in Iteratoren wie diesem nach vorne zu schauen:
%Vor%Obwohl ich nicht sicher bin, ob es einen Namen für diese Technik oder Funktion in itertools gibt, die das schon tun wird. Irgendwelche Ideen?
Danke!
Es gibt einfachere Möglichkeiten, wenn Sie nur Listen verwenden - siehe Svens Antwort. Hier ist eine Möglichkeit, dies für allgemeine Iteratoren zu tun:
%Vor%So verwenden Sie es in einer for-Schleife wie in Ihrer Frage.
%Vor%Schließlich ist hier die Funktion, nach der Sie suchen
%Vor%Ich mag sowohl Svens als auch gnibblers Antworten, aber aus irgendeinem Grund gefällt es mir, meinen eigenen Generator zu rollen.
> %Vor%Getestet:
%Vor% Bearbeiten : Karl und Ninjagecko heben einen ausgezeichneten Punkt an - die übergebene Sequenz kann None
enthalten, und daher kann die Verwendung von None
als endgültiger Lookahead-Wert zu Mehrdeutigkeit führen. Aber es gibt keine offensichtliche Alternative; Eine Modulebenenkonstante ist möglicherweise in vielen Fällen der beste Ansatz, kann aber für eine einmalige Funktion wie diese übertrieben sein - ganz zu schweigen von der Tatsache, dass bool(object()) == True
zu einem unerwarteten Verhalten führen kann. Stattdessen habe ich einen null_item
-Parameter mit einem Standardwert von None
hinzugefügt - so können Benutzer alles einbringen, was für ihre Bedürfnisse sinnvoll ist, sei es eine einfache object()
sentinel, eine Konstante ihrer eigenen Erstellung, oder sogar eine Klasseninstanz mit speziellem Verhalten. Da die meiste Zeit None
das offensichtliche und möglicherweise sogar das erwartete Verhalten ist, habe ich None
als Standard verlassen.
Der übliche Weg, dies für eine Liste a
zu tun, ist
Für das letzte Token erhalten Sie None
als Look-Ahead-Token.
Wenn Sie die Kopie der Liste vermeiden möchten, die von a[1:]
eingeführt wurde, können Sie stattdessen islice(a, 1, None)
verwenden. Für eine geringfügige Modifikation, die für beliebige Iterables funktioniert, siehe die Antwort von gnibbler . Für eine einfache, leicht verständliche Generatorfunktion, die auch für beliebige Iterables arbeitet, siehe die Antwort durch sendele .
Hier finden Sie möglicherweise die Antwort auf Ihre Frage: Verwenden von Lookahead mit Generatoren .
Ich halte alle diese Antworten für falsch, da sie unvorhergesehene Fehler verursachen, wenn Ihre Liste None
enthält. Hier ist mein Beispiel:
Beispiel:
%Vor%Beispiel, wie diese Antwort besser ist:
%Vor%