Предположим, у меня есть следующие утверждения:
1 == 1
2 == 1
3 == 2
Я хочу проверить, если и только если одно из этих утверждений является true
. Ожидаемый результат для приведенного выше примера — true
. Очевидно, что если я использую функцию all
для приведенного выше примера, я получаю false
. Если я использую функцию any
, то это нарушает правило в других ситуациях. Например:
julia> any([1==1, 2==2, 3==1])
true
Мне нужно false
в этом случае, потому что есть два утверждения true
, а не одно. Другой подход заключается в использовании множества связанных правдивых утверждений, таких как ||
и &&
, что приводит к большому количеству строк кода, если моих утверждений больше. Итак, я ищу хороший и оптимальный способ для этого.
Подход может использовать функцию sum
:
julia> sum([1==1, 2==2, 3==1])
2
julia> sum([1==1, 2==1, 3==1])
1
Так:
0
, то все утверждения являются false
.1
, есть только утверждение true
.Если я попытаюсь сравнить свое предложение с предложением @fredrikekre:
julia> f1(vec::Vector{Bool}) = sum(vec) == 1;
julia> f2(vec::Vector{Bool}) = count(vec) == 1;
julia> @benchmark f1([1==1, 2==1, 3==1])
BenchmarkTools.Trial: 10000 samples with 993 evaluations.
Range (min … max): 37.059 ns … 1.709 μs ┊ GC (min … max): 0.00% … 97.14%
Time (median): 39.174 ns ┊ GC (median): 0.00%
Time (mean ± σ): 44.735 ns ± 55.112 ns ┊ GC (mean ± σ): 4.33% ± 3.47%
▄▆█▆▅▃▂▂▁ ▁▁▁▁ ▁▂▂▃ ▂
█████████▇▆▇██████▇▆▆▇▆▆▇▇██▇███████▇▇▇▇▆▆▅▇▆▇▆▆▆▅▅▁▆▅▅▄▄▅▅ █
37.1 ns Histogram: log(frequency) by time 86.8 ns <
Memory estimate: 64 bytes, allocs estimate: 1.
julia> @benchmark f2([1==1, 2==1, 3==1])
BenchmarkTools.Trial: 10000 samples with 992 evaluations.
Range (min … max): 37.399 ns … 2.559 μs ┊ GC (min … max): 0.00% … 97.92%
Time (median): 39.516 ns ┊ GC (median): 0.00%
Time (mean ± σ): 50.292 ns ± 68.392 ns ┊ GC (mean ± σ): 4.74% ± 3.50%
▄█▆▄▃▁▁ ▁▁▃▄▄▄ ▁
███████▇▅▆▇████▇▆▇▆▆▅▆▆▆▆▅▇█████████▆▄▆▆▇▇▇▆▆▅▆▆▆▅▄▄▅▆▆▅▅▅▃ █
37.4 ns Histogram: log(frequency) by time 95.6 ns <
Memory estimate: 64 bytes, allocs estimate: 1.
Я вижу, что мой работает немного лучше.
@НилсЛ. часть ? true ...
не нужна. Спасибо.
Вы можете использовать count:
julia> count(i == 2 for i in 1:4) == 1
true
julia> count([1 == 2, 2 == 2, 3 == 2]) == 1
true
Да, это другой подход. Спасибо!
Вы можете сделать это маленькой однострочной функцией:
one_true(list) = sum(list) == 1 ? true : false