Как установить продукт на 0, если это продукт над пустым списком в Джулии?

В своем коде я использую функцию prod() Джулии, чтобы произвести произведение элементов списка. Однако иногда этот список пуст, и в этом случае я хочу, чтобы prod(myList) просто возвращал 0 (или любое фиксированное число, например 1). Я пытался искать в Интернете, но единственное, что я мог найти, это итераторы или что-то в этом роде.

Я использую Юлию версии 1.5.2.


person graphtheory12345678    schedule 26.02.2021    source источник
comment
Что дает eltype(MyList), когда этот список пуст? Как упоминалось в комментариях, я думаю, что prod — это правильная функция для использования без изменений, и что реальная проблема может заключаться в том, как вы создаете этот пустой список.   -  person Benoit Pasquier    schedule 26.02.2021


Ответы (4)


Подойдет ли в вашем случае простой тернарный оператор?

isempty(my_list) ? 0 : prod(my_list)
person Nils Gudat    schedule 26.02.2021
comment
Имейте в виду, что это решение является нестабильным по типу. Если my_list является вектором с плавающей запятой или комплексными числами, компилятор не может сказать, какой тип будет возвращен. - person DNF; 26.02.2021
comment
По крайней мере, вы могли бы использовать zero(my_list) вместо 0 (Int64). - person crstnbr; 26.02.2021
comment
если бы one(my_list) работало, то prod(my_list) работало бы, например. prod(Int[]) это 1. Если prod терпит неудачу, это означает, что eltype из my_list не определено или, например. Any (наиболее вероятный случай). - person Bogumił Kamiński; 26.02.2021
comment
Я согласен с ДНФ. И Богумил, хотя я думаю, что в ответ на crstnbr он имел в виду, что zero(my_list) потерпит неудачу, если prod(my_list) потерпит неудачу. Я бы рекомендовал использовать функцию Base prod и просто убедиться, что в списке есть конкретный eltype, для которого работает one (например, Int, Float64 и т. д. будут работать, но точно не Any). - person Benoit Pasquier; 26.02.2021

То, что вы хотите, неверно/нетрадиционно. произведение элементов пустой последовательности должно быть равно 1, поскольку это мультипликативный элемент идентичности. .

person Kaz    schedule 26.02.2021
comment
Нет, в данном случае я хочу, чтобы это было 0. Если вы знаете, как сделать его равным 1, это сработает, потому что тогда я могу просто вычесть 1. - person graphtheory12345678; 26.02.2021
comment
Так почему бы просто не определить свой собственный prod (@_@;) - person Jun Tian; 26.02.2021
comment
Потому что я хотел бы иметь чистый способ сделать это, и зачем изобретать велосипед, если это уже сделано. - person graphtheory12345678; 26.02.2021
comment
Произведение пустой последовательности, равное 1, означает, что мы можем взять, скажем, {1, 2, 3} и разделить его на все возможные подпоследовательности, так что все их отдельные произведения равны 6, включая пустые последовательности, например prod({}) x prod({1, 2}) x prod({3}) по-прежнему равно 6. - person Kaz; 26.02.2021

Любое фиксированное число легко:

reduce(*, ls; init=1)

Но это не работает с нулем, так как это аннулятор, который отправляет все произведение в ноль:

julia> ls = [1,2,3]
3-element Array{Int64,1}:
 1
 2
 3

julia> reduce(*, ls; init=0)
0

Теперь, возвращая 1, а затем проверяя, работает ли это, если у вас есть только целые числа. Этого не произойдет, как только у вас будет продукт, превышающий рациональные числа, поскольку тогда результирующее 1 может также происходить из x * (1/x).

person phipsgabler    schedule 26.02.2021

person    schedule
comment
Хотя этот фрагмент кода может дать решение вопроса, лучше добавить контекст, почему и как он работает. Это может помочь будущим пользователям изучить и в конечном итоге применить эти знания к своему собственному коду. Вы также, вероятно, получите положительные отзывы / голоса от пользователей, когда код будет объяснен. - person Amit Verma; 28.02.2021