2016-03-20 8 views
1

Ich habe ein Array:prüft ein modifiziertes Element eines Arrays ist Mitglied in dem gleichen Array

{ "abc" "def" "cba" "fed" "junk" } 

Ich möchte in dem Array, wenn jedes Element zu prüfen, seine umgekehrte Version als Mitglied hat in der gleichen Array.

>>> array = ["abc", "def", "cba", "fed", "junk"] 
>>> [item for item in array if item[::-1] in array] # [::-1] reverses a string 
['abc', 'def', 'cba', 'fed'] 

Oder auch:

In Python, ich dies als ausdrücken würde

>>> list(filter(lambda x: x[::-1] in array, array)) 
['abc', 'def', 'cba', 'fed']  

Ich habe versucht:

IN: scratchpad dup [ dup reverse swap member? ] filter 

--- Data stack: 
{ "abc" "def" "cba" "fed" "junk" } 
{ } 

Nein, nicht das Zitat für jeden Artikel .

Ich bin sicher, es gibt eine offensichtliche Antwort, oder ein Kombinator und ein Zitat, das dies effizient macht. Was ist es?

Antwort

1

Hier benötigen Sie einen Verschluss. Das Angebot, das für jedes Element ausgeführt wird, muss einen anderen Wert als das Element selbst berücksichtigen. Eine praktische Syntax zum Schreiben von Schließungen wird unter Verwendung von implementiert.

Z. B:

{ "abc" "def" "cba" "fed" "junk" } dup '[ reverse _ in? ] map 

Sie binden den Wert aus dem Stapel auf der „Außenseite“ den _ Fleck auf der „Innenseite“.

{ "abc" "def" "cba" "fed" "junk" } dup [ reverse swap in? ] with map 

Sie Dann fügen Sie all? zu prüfen, ob alle Werte erfüllt das Prädikat:

{ "abc" "def" "cba" "fed" "junk" } dup '[ reverse _ in? ] all? 

USE: sets Sie können curry einen äquivalenten Verschluss mit with oder mit denen ist ein Low-Level-Wort konstruieren und laufen um das in? Wort zu laden.

+0

Aha! Vielen Dank! – cat

+0

Also 'in?' Ist für 'set's und' member? 'Ist für' seq'uences. Ein '{array}' ist eine Sequenz, richtig? Gibt es also einen Grund, 'in?' Über 'member?'? – cat

+1

'in?' Ist ein paar Zeichen kürzer als 'member?'. Für Sequenzen machen sie das Gleiche. Der Grund, warum es zwei Varianten gibt, ist wahrscheinlich Erbe. –