¿Cómo puedo encontrar la intersección de dos listas en AppleScript?

5

Digamos que tengo dos listas en AppleScript:

set listA to {"red", "green", "blue"}
set listB to {"green", "blue"}

Me gustaría crear una tercera lista que tenga solo los elementos presentes en ambas listas :

set listC to intersection of listA and listB --something like this
-- would return {"green", "blue"}

Básicamente, algo así como array_intersect () de PHP.

¿Hay una forma integrada de hacer esto?
Si no, me encantaría una recomendación para una adición de secuencias de comandos que resuelva este problema.

    
pregunta Nathan Greenstein 17.08.2011 - 02:44

1 respuesta

5

La List & Herramientas de registro Scripting Addition proporciona intersection of listA and listB (entre otros bits de terminología).

No hay una "primitiva" incorporada para calcular una intersección de lista. Por lo general, uno solo usaría uno o más bucles para verificar cada elemento de una lista con el otro. Esto se puede simplificar (y acelerar 1 ) un bit usando uno de los operadores is in / is contained by / contains (o una negación de los mismos):

set listA to {"red", "green", "blue"}
set listB to {"green", "blue"}

to intersection of listA against listB
    local newList, a
    set newList to {}
    repeat with a in listA
        set a to contents of a -- dereference implicit loop reference
        if {a} is in listB then set end of newList to a
    end repeat
    newList
end intersection

intersection of listA against listB --> {"green", "blue"}

1 El operador is in y sus parientes se implementan en el entorno de ejecución de AppleScript en un código de nivel inferior, donde se ejecutan mucho más rápido que el código de AppleScript interpretado normalmente.

Por cierto, los controladores que usan parámetros etiquetados tienen un conjunto limitado de términos que se pueden usar para las etiquetas. Por ejemplo, intersection of listA and listB no es posible como un controlador definido por el usuario porque and no es una etiqueta reconocida. Consulte la sección AppleScript Language Guide en la sección controladores con parámetros etiquetados para obtener una lista de etiquetas válidas. Las aplicaciones y las extensiones OSA pueden definir sus propias terminologías (por ejemplo, la Lista y el Registro OSAX proporcionan esta sintaxis exacta), pero los controladores definidos por el usuario no son tan flexibles. Por lo general, solo uso los parámetros posicionales ( handlerName(param1, param2, …) ) en lugar de intentar que las invocaciones de mis controladores se vean como prosa.

    
respondido por el Chris Johnsen 17.08.2011 - 04:12

Lea otras preguntas en las etiquetas