List comprehension — это синтаксическая конструкция, доступная в некоторых языках программирования для создания списка на основе существующих списков. Она следует форме математической нотации set-builder ( set comprehension ), в отличие от использования функций map и filter .
Список всех двойников от 0 до 10 (исключая)
удваивает = [ i * 2 для i в диапазоне ( 10 )]
Список имен клиентов, находящихся в Рио-де-Жанейро
rjCustomers = [ клиент . Имя клиента в клиентах , если клиент . Состояние == "RJ" ]
var ns = from x in Enumerable . Диапазон ( 0 , 100 ) , где x * x > 3 select x * 2 ;
Предыдущий код представляет собой синтаксический сахар для следующего кода, написанного с использованием лямбда-выражений:
var ns = Перечислимый . Диапазон ( 0 , 100 ) . Где ( x => x * x > 3 ) . Выбрать ( x => x * 2 );
Фильтрация чисел, делящихся на 3:
значение divisibleBy3 = { for ( i in 0 .. 100 ) if ( i % 3 == 0 ) i }; // тип divisibleBy3 — Iterable<Integer>
Несколько «генераторов»:
значение тройки = { for ( x in 0 .. 20 ) for ( y in x .. 20 ) for ( z in y .. 20 ) if ( x * x + y * y == z * z ) [ x , y , z ] }; // тип троек Iterable<Integer[3]>
Бесконечная ленивая последовательность:
( for [x ( iterate inc 0 ) :when ( > ( * x x ) 3 ) ] ( * 2 x ))
Понимание списка с использованием нескольких генераторов:
( для [x ( диапазон 20 ) y ( диапазон 20 ) z ( диапазон 20 ) : когда ( == ( + ( * x x ) ( * y y )) ( * z z )) ] [x y z] )
largeNumbers = ( число для числа в списке , когда число > 100 )
Списочные интерпретации могут быть выражены с помощью ключевого слова loop
макроса collect
. Условные конструкции выражаются с помощью if
, как показано ниже:
( цикл для x от 0 до 100 если ( > ( * x x ) 3 ) собрать ( * 2 x ))
Перечислите имена клиентов:
имена = для cust в customers получить cust . имя
Список клиентов с остатками:
имена = для клиентов , где баланс клиента > 0
Перечислите имена клиентов, имеющих остатки на счетах:
имена = для cust в клиентах , где cust . balance > 0 получить cust . name
Общие формы:
для VAR в ENUMERABLE [ где УСЛОВИЕ ] получить EXPR для VAR в ENUMERABLE где УСЛОВИЕ
Обратите внимание, что, поместив условие и выражение после имени переменной и перечисляемого объекта, редакторы и IDE могут обеспечить автодополнение для членов переменной.
[ для ( переменная i в диапазоне ( 0 , 100 )) если ( i * i > 3 ) i * 2 ]
var pyth = [ for ( var x in range ( 1 , 20 )) for ( var y in range ( x , 20 )) for ( var z in range ( y , 20 )) if ( x * x + y * y == z * z ) [ x , y , z ] ];
Итерируемый <int> диапазон ( int start , int end ) = > Список . generate ( end - start , ( i ) => start + i ) ;
для x <- 0 .. 100 , x * x > 3 , сделать : x * 2
L = списки : seq ( 0 , 100 ). S = [ 2 * X || X <- L , X * X > 3 ].
Лениво оцениваемые последовательности:
seq { for x in 0 .. 100 do if x * x > 3 then yield 2 * x }
Или, для значений с плавающей точкой
seq { for x in 0 . .. 100 . do if x ** 2 . > 3 . then yield 2 .* x }
Списки и массивы:
[ for x in 0 . .. 100 . do if x ** 2 . > 3 . then yield 2 .* x ] [| for x in 0 . .. 100 . do if x ** 2 . > 3 . then yield 2 .* x |]
Списковые генераторы являются частью большого семейства языковых конструкций, называемых вычислительными выражениями.
[ х * 2 | х <- [ 0 .. 99 ], х * х > 3 ]
Пример понимания списка с использованием нескольких генераторов:
pyth знак равно [( Икс , y , z ) | x <- [ 1 .. 20 ], y <- [ x .. 20 ], z <- [ y .. 20 ], x ^ 2 + y ^ 2 == z ^ 2 ]
Используя объект Range, язык IO может создавать списки так же просто, как и в других языках:
Диапазон от 0 до ( 100 ) asList select ( x , x * x > 3 ) map (* 2 )
Списочные интерпретации могут быть выражены с помощью for
специальной формы. Условные конструкции выражаются с помощью if
, как показано ниже:
( for (( x 0 ( + x 1 )) ( collect ())) (( >= x 100 ) ( reverse collect )) ( if ( > ( * x x ) 3 ) ( setq collect ( cons ( * x 2 ) collect ))))
Julia поддерживает понимание, используя синтаксис:
y = [ x ^ 2 + 1 для x в 1 : 10 ]
и многомерные понимания, такие как:
z = [( x - 5 ) ^ 2 + ( y - 5 ) ^ 2 для x = 0 : 10 , y = 0 : 10 ]
Также можно добавить условие:
v = [ 3 x ^ 2 + 2 y ^ 2 для x из 1 : 7 для y из 1 : 7 если x % y == 0 ]
И просто заменив квадратные скобки на круглые, мы получим генератор:
g = ( 3 x ^ 2 + 2 y ^ 2 для x из 1 : 7 для y из 1 : 7 если x % y == 0 )
s = [ 2*i для i в диапазоне 1..100, где i*i > 3 ];
Несколько генераторов:
pyth = [ (x,y,z) для x в диапазоне 1..20 для y в диапазоне x..20 для z в диапазоне y..20, где x*x + y*y == z*z ];
$[ x * 2 | x в [ 0 .. 100 ], x * x > 3 ]
Nim имеет встроенные seq, set, table и object-композиции в модуле стандартной библиотеки sugar: [1]
импортный сахар пусть переменная = collect ( newSeq ): для элемента в @[- 9 , 1 , 42 , 0 , - 1 , 9 ] : элемент + 1 утвердить переменную == @[- 8 , 2 , 43 , 1 , 0 , 10 ]
Включение реализовано как макрос, который расширяется во время компиляции. Вы можете увидеть расширенный код с помощью опции компилятора expandMacro :
var collectResult = newSeq ( Natural ( 0 )) для элемента в элементах ( @[- 9 , 1 , 42 , 0 , - 1 , 9 ] ): добавить ( collectResult , item + 1 ) collectResult
Выражения могут быть вложенными и многострочными:
импортный сахар пусть значения = собрать ( newSeq ): для val в [ 1 , 2 ] : собрать ( newSeq ): для val2 в [ 3 , 4 ] : если ( val , val2 ) != ( 1 , 2 ): ( val , val2 ) утвердить значения == @[@[ ( 1 , 3 ), ( 1 , 4 ) ] , @[ ( 2 , 3 ), ( 2 , 4 ) ]]
OCaml поддерживает понимание списков с помощью OCaml Batteries . [2]
мой @s = карта { 2 * $_ } grep { $_ ** 2 > 3 } 0 .. 99 ;
Массив со всеми числами двойной точности от 1 до 9 включительно:
мои @doubles = карта { $_ * 2 } 1 .. 9 ;
Массив с именами клиентов, проживающих в Рио-де-Жанейро (из массива хэшей):
мой @rjCustomers = карта { $_ -> { состояние } экв "RJ" ? $_ -> { имя } : ()} @customers ;
Фильтрация чисел, делящихся на 3:
мой @divisibleBy3 = grep { $_ % 3 == 0 } 0 .. 100 ;
$s = ( 0 .. 100 | ? { $_ * $_ -больше 3 } | % { 2 * $_ } )
что является сокращенной записью:
$s = 0 .. 100 | where-object { $_ * $_ -gt 3 } | foreach -object { 2 * $_ }
Для выражения списочных представлений над конечными списками в Python используется следующий синтаксис:
S = [ 2 * x для x в диапазоне ( 100 ) если x ** 2 > 3 ]
Выражение генератора может использоваться в версиях Python >= 2.4, что обеспечивает ленивую оценку входных данных, и может использоваться с генераторами для итерации по «бесконечным» входным данным, таким как функция генератора количества, которая возвращает последовательные целые числа:
из itertools импортировать количество S = ( 2 * x для x в количестве () если x ** 2 > 3 )
(Последующее использование выражения генератора определит, когда следует прекратить генерацию значений).
х <- 0 : 100 С <- 2 * х [ х ^ 2 > 3 ]
( для/список ([ x 100 ] #:когда ( > ( * x x ) 3 )) ( * x 2 ))
Пример с несколькими генераторами:
( for*/list ([ x ( в диапазоне 1 21 )] [ y ( в диапазоне 1 21 )] [ z ( в диапазоне 1 21 )] #:when ( = ( + ( * x x ) ( * y y )) ( * z z ))) ( список x y z ))
мой @s = ( $_ * 2 если $_ ** 2 > 3 для 0 .. 99 );
Использование for-понимания:
val s = for ( x <- 0 to 100 ; if x * x > 3 ) yield 2 * x
Списковые представления поддерживаются в Scheme с помощью библиотеки SRFI -42. [3]
( список-ec ( : x 100 ) ( если ( > ( * x x ) 3 )) ( * x 2 ))
Пример понимания списка с использованием нескольких генераторов:
( список-ec ( : x 1 21 ) ( : y x 21 ) ( : z y 21 ) ( если ( = ( + ( * x x ) ( * y y )) ( * z z ))) ( список x y z ))
s := {2*x : x в {0..100} | x**2 > 3 };
(( 1 до: 100 ) выбрать: [ : x | x в квадрате > 3 ]) собрать: [ : x | x * 2 ]
S = [ 2 * X || X = список::getMember_nd ( L ) , X * X > 3 ]