Después de de esta larga compilación de datos pudimos resolver este apuro que suelen tener muchos los usuarios. Te regalamos la respuesta y nuestro objetivo es serte de gran apoyo.
Solución:
Usando el muy popular paquete Iterators.jl, en Julia:
using Iterators # install using Pkg.add("Iterators")
filter(x->sum(x)>7,product(l1,l2))
es un iterador que produce los pares. Entonces, para obtener la misma impresión que el OP:
l3iter = filter(x->sum(x)>7,product(l1,l2))
for p in l3iter println(p); end
El enfoque del iterador es potencialmente mucho más eficiente en memoria. Por supuesto, uno podría simplemente l3 = collect(l3iter)
para obtener el vector par.
@ user2317519, solo curiosidad, ¿hay una forma de iterador equivalente para python?
Guardias (if
) ahora están disponibles en Julia v0.5 (actualmente en la etapa de candidatura a lanzamiento):
julia> v1 = [1, 2, 3];
julia> v2 = [4, 5, 6];
julia> v3 = [(a, b) for a in v1, b in v2 if a+b > 7]
3-element ArrayTupleInt64,Int64,1:
(3,5)
(2,6)
(3,6)
Tenga en cuenta que los generadores ahora también están disponibles:
julia> g = ( (a, b) for a in v1, b in v2 if a+b > 7 )
Base.GeneratorFilter##18#20,Base.Prod2ArrayInt64,1,ArrayInt64,1,##17#19(#17,Filter##18#20,Base.Prod2ArrayInt64,1,ArrayInt64,1(#18,Base.Prod2ArrayInt64,1,ArrayInt64,1([1,2,3],[4,5,6])))
Otra opción similar a la de @DanGetz usando también Iterators.jl
:
function expensive_fun(a, b)
return (a + b)
end
Entonces, si la condición también es complicada, se puede definir como una función:
condition(x) = x > 7
Y por último, filtrar los resultados:
>>> using Iterators
>>> result = filter(condition, imap(expensive_fun, l1, l2))
result
es un iterable que solo se calcula cuando es necesario (económico) y se puede recopilar collect(result)
si es requerido.
La línea única si la condición del filtro es lo suficientemente simple sería:
>>> result = filter(x->(x > 7), imap(expensive_fun, l1, l2))
Nota: imap
funciona de forma nativa para un número arbitrario de parámetros.
Tienes la opción de estimular nuestra labor dejando un comentario o dejando una puntuación te damos la bienvenida.