stringtranslate.com

Comparación de lenguajes de programación (comprensión de listas)

La comprensión de listas es una construcción sintáctica disponible en algunos lenguajes de programación para crear una lista basada en listas existentes. Sigue la forma de la notación matemática del constructor de conjuntos ( comprensión de conjuntos ) a diferencia del uso de funciones de mapa y filtro .

Ejemplos de comprensión de listas

Abucheo

Listado con todos los dobles del 0 al 10 (exclusivo)

dobles = [ i * 2 para i en el rango ( 10 )]      

Lista con los nombres de los clientes radicados en Río de Janeiro

rjClientes = [ cliente . Nombre del cliente en clientes si cliente . Estado == "RJ" ]          

C#

var ns = de x en Enumerable . Rango ( 0 , 100 ) donde x * x > 3 seleccione x * 2 ;                 

El código anterior es azúcar sintáctico para el siguiente código escrito usando expresiones lambda:

var ns = Enumerable . Rango ( 0 , 100 ) . Donde ( x => x * x > 3 ) . Seleccione ( x => x * 2 );                

Ceilán

Filtrar números divisibles por 3:

valor divisibleBy3 = { para ( i en 0 .. 100 ) si ( i % 3 == 0 ) i }; // el tipo de divisibleBy3 es Iterable<Integer>           

Múltiples "generadores":

valor se triplica = { para ( x en 0 .. 20 ) para ( y en x .. 20 ) para ( z en y .. 20 ) if ( x * x + y * y == z * z ) [ x , y , z ] }; // el tipo de tripletas es Iterable<Integer[3]>                       

Clojure

Una secuencia perezosa infinita:

 ( para [x ( iterar inc 0 ) : cuando ( > ( * x x ) 3 ) ] ( * 2 x ))              

Una lista de comprensión utilizando múltiples generadores:

 ( para [x ( rango 20 ) y ( rango 20 ) z ( rango 20 ) : cuando ( == ( + ( * x x ) ( * y y )) ( * z z )) ] [x y z] )                        

CaféScript

númerosgrandes = ( número para el número en la lista cuando el número > 100 )          

ceceo común

Las listas por comprensión se pueden expresar con la palabra clave loopde la macro collect. Los condicionales se expresan con if, de la siguiente manera:

( bucle para x de 0 a 100 si ( > ( * x x ) 3 ) recoger ( * 2 x ))                

Cobra

Enumere los nombres de los clientes:

nombres  =  para  clientes  en  clientes  obtienen  clientes . nombre

Listar los clientes con saldos:

nombres  =  para  cliente  en  clientes  donde  cliente . saldo  >  0

Enumere los nombres de los clientes con saldos:

nombres  =  para  cliente  en  clientes  donde  cliente . saldo  >  0  obtener  cliente . nombre

Las formas generales:

para  VAR  en  ENUMERABLE  [ donde  CONDICIÓN ]  obtenga  EXPR para  VAR  en  ENUMERABLE  donde  CONDICIÓN

Tenga en cuenta que al colocar la condición y la expresión después del nombre de la variable y el objeto enumerable, los editores y los IDE pueden proporcionar autocompletado en los miembros de la variable.

Dardo

[ para ( var i en el rango ( 0 , 100 )) si ( i * i > 3 ) i * 2 ]              
var pyth = [ para ( var x en el rango ( 1 , 20 )) para ( var y en el rango ( x , 20 )) para ( var z en el rango ( y , 20 )) si ( x * x + y * y = = z * z ) [ x , y , z ] ];                                    
Rango iterable <int> ( int inicio , int fin ) = > Lista .generar ( fin - inicio , ( i ) => inicio + i );             

Elixir

para x <- 0 .. 100 , x * x > 3 , haga : x * 2            

erlang

L = listas : seq ( 0 , 100 ). S = [ 2 * X || X <- L , X * X > 3 ].           

F#

Secuencias evaluadas con pereza:

seq { para x en 0 .. 100 hazlo si x * x > 3 entonces produce 2 * x }                

O, para valores de punto flotante

seq { para x en 0 . .. 100 . hazlo si x ** 2 . > 3 . luego produce 2 .* x }                

Listas y matrices:

[ para x en 0 . .. 100 . hazlo si x ** 2 . > 3 . luego produce 2 .* x ] [| para x en 0 . .. 100 . hazlo si x ** 2 . > 3 . luego produce 2 .* x |]                              

Las listas por comprensión son parte de una familia más amplia de construcciones del lenguaje llamadas expresiones de cálculo.


Haskell

[ x * 2 | x <- [ 0 .. 99 ], x * x > 3 ]             

Un ejemplo de comprensión de listas utilizando múltiples generadores:

pyth = [( x , y , z ) | x <- [ 1 .. 20 ], y <- [ x .. 20 ], z <- [ y .. 20 ], x ^ 2 + y ^ 2 == z ^ 2 ]                 

yo

Al utilizar el objeto Range, el lenguaje Io puede crear listas tan fácilmente como en otros lenguajes:

Rango 0 a ( 100 ) asList seleccionar ( x , x * x > 3 ) mapa (* 2 )      

islisp

Las listas por comprensión se pueden expresar con la forforma especial. Los condicionales se expresan con if, de la siguiente manera:

( para (( x 0 ( + x 1 )) ( cobrar ())) (( >= x 100 ) ( cobrar inverso )) ( if ( > ( * x x ) 3 ) ( setq cobrar ( contras ( * x 2 ) recolectar ))))                         


Julia

Julia apoya la comprensión usando la sintaxis:

 y = [ x ^ 2 + 1 para x en 1 : 10 ]      

y comprensiones multidimensionales como:

 z = [( x - 5 ) ^ 2 + ( y - 5 ) ^ 2 para x = 0 : 10 , y = 0 : 10 ]         

También es posible agregar una condición:

v = [ 3 x ^ 2 + 2 y ^ 2 para x en 1 : 7 para y en 1 : 7 si x % y == 0 ]                  

Y simplemente cambiando los corchetes por los redondos, obtenemos un generador:

g = ( 3 x ^ 2 + 2 y ^ 2 para x en 1 : 7 para y en 1 : 7 si x % y == 0 )                  

mitrilo

s = [ 2*i para i en 1..100 donde i*i > 3 ];

Múltiples generadores:

pyth = [ (x,y,z) para x en 1..20 para y en x..20 para z en y..20 donde x*x + y*y == z*z ];

Nemerle

$[ x * 2  |  x  en  [ 0  ..  100 ],  x * x  >  3 ]

nim

Nim tiene comprensiones de secuencias, conjuntos, tablas y objetos integradas en el módulo de biblioteca estándar de azúcar: [1]

importar azúcar let variable = recopilar ( newSeq ): para el elemento en @[- 9 , 1 , 42 , 0 , - 1 , 9 ] : elemento + 1               afirmar variable == @[- 8 , 2 , 43 , 1 , 0 , 10 ]        

La comprensión se implementa como una macro que se expande en el momento de la compilación; puede ver el código expandido usando la opción del compilador expandMacro :

var recopilarResultado = newSeq ( Natural ( 0 )) para elemento en elementos ( @[- 9 , 1 , 42 , 0 , - 1 , 9 ] ): agregar ( recopilarResultado , elemento + 1 ) recopilarResultado               

Las comprensiones pueden ser anidadas y multilínea:

importar azúcar let valores = recopilar ( newSeq ): para val en [ 1 , 2 ] : recopilar ( newSeq ): para val2 en [ 3 , 4 ] : if ( val , val2 ) ! = ( 1 , 2 ): ( val , val2 ) afirmar valores == @[@[ ( 1 , 3 ), ( 1 , 4 ) ] , @[ ( 2 , 3 ), ( 2 , 4 ) ]]                                 

OCaml

OCaml admite la comprensión de listas a través de baterías OCaml . [2]

perla

mi @s = mapa { 2 * $_ } grep { $_ ** 2 > 3 } 0 .. 99 ;             

Matriz con todos los dobles del 1 al 9 inclusive:

mis @doubles = mapa { $_ * 2 } 1 .. 9 ;       

Matriz con los nombres de los clientes con sede en Río de Janeiro (a partir de una serie de hashes):

mi @rjCustomers = mapa { $_ -> { estado } eq "RJ" ? $_ -> { nombre } : ()} @clientes ;           

Filtrar números divisibles por 3:

mi @divisibleBy3 = grep { $_ % 3 == 0 } 0 .. 100 ;         

Potencia Shell

$s  =  (  0 .. 100  |  ?  { $_ * $_  -gt  3 }  |  %  { 2 * $_ }  )

que es una notación abreviada de:

$s  =  0 .. 100  |  objeto-dónde  { $_ * $_  -gt  3 }  |  foreach -objeto  { 2 * $_ }

Pitón

Python usa la siguiente sintaxis para expresar listas por comprensión en listas finitas:

S  =  [ 2  *  x  para  x  en el  rango ( 100 )  si  x  **  2  >  3 ]

Se puede usar una expresión generadora en las versiones de Python >= 2.4, que proporciona una evaluación diferida de su entrada, y se puede usar con generadores para iterar sobre entradas 'infinitas', como la función generadora de conteo que devuelve enteros sucesivos:

de  itertools  importar  recuento S  =  ( 2  *  x  para  x  en  recuento ()  si  x  **  2  >  3 )

(El uso posterior de la expresión generadora determinará cuándo dejar de generar valores).

R

 x <- 0 : 100 S <- 2 * x [ x ^ 2 > 3 ]           

Raqueta

( para/lista ([ x 100 ] #:cuando ( > ( * x x ) 3 )) ( * x 2 ))           

Un ejemplo con múltiples generadores:

( for*/list ([ x ( dentro del rango 1 21 )] [ y ( dentro del rango 1 21 )] [ z ( dentro del rango 1 21 )] #:cuando ( = ( + ( * x x ) ( * y y )) ( * z z ))) ( lista x y z ))                            

rakú

 mis  @s = ( $_ * 2  si  $_ ** 2 > 3  para  0 .. 99 );

escala

Usando el para-comprensión:

val s = for ( x <- 0 a 100 ; si x * x > 3 ) produce 2 * x              

Esquema

La comprensión de listas se admite en Scheme mediante el uso de la biblioteca SRFI -42. [3]

( lista-ec ( : x 100 ) ( si ( > ( * x x ) 3 )) ( * x 2 ))            

Un ejemplo de comprensión de listas utilizando múltiples generadores:

( lista-ec ( : x 1 21 ) ( : y x ​​21 ) ( : z y 21 ) ( si ( = ( + ( * x x ) ( * y y )) ( * z z ))) ( lista x y z ))                            

SETL

s := {2*x : x en {0..100} | x**2 > 3 };

Charla

(( 1  a:  100 ) seleccione: [ : x  |  x  cuadrado  >  3 ]) recopile: [ : x  |  x  *  2 ]

Prólogo visual

S = [  2 * X  ||  X = lista::getMember_nd ( L ) , X * X > 3  ]

Referencias

  1. ^ Módulo de azúcar Nim
  2. ^ Baterías OCaml incluidas
  3. ^ Esquema SRFI 42: Comprensiones ansiosas

enlaces externos