Сначала вы должны нарисовать столбцы, которые вы хотите видеть, а затем вы наносите белую полосу над остальными. Но это скорее взлом, чем хорошее решение.
import matplotlib.pyplot as plt
import numpy as np
target_bars_start = [10, 10, 15, 8]
target_bars_end = [15, 23, 16, 10]
N = len(target_bars_end)
ind = np.arange(N)
plt.barh(ind, target_bars_end, 0.35)
plt.barh(ind, target_bars_start, 0.35, color='white')
Нет никакой идиомы, о которой я знаю, но вот довольно естественное определение с помощью инфиксного оператора:
# let (--) i j =
let rec aux n acc =
if n < i then acc else aux (n-1) (n :: acc)
in aux j [] ;;
val ( -- ) : int -> int -> int list = <fun>
# 1--2;;
- : int list = [1; 2]
# 1--5;;
- : int list = [1; 2; 3; 4; 5]
# 5--10;;
- : int list = [5; 6; 7; 8; 9; 10]
, С другой стороны, эти расширение синтаксиса пониманий (который дает синтаксис [i .. j]
для вышеупомянутого), вероятно, будет включено в будущий выпуск "версия сообщества" OCaml, так, чтобы мог стать идиоматичным. Я не рекомендую начать играть с расширениями синтаксиса, если Вы плохо знакомы с языком, все же.
Здесь Вы идете:
let rec range i j = if i > j then [] else i :: (range (i+1) j)
Примечание, что это не рекурсивно хвостом. Современные версии Python даже имеют ленивый диапазон.
BTW, в Haskell, которого Вы использовали бы
enumFromTo 1 n
[1 .. n]
, Они являются просто ненужными.
take n [1 ..]
take n $ iterate (+1) 1
С Батареи в комплекте вы можете написать
let nums = List.of_enum (1--10);;
Оператор -
генерирует перечисление от первого значения ко второму. Оператор - ^
аналогичен, но перечисляет полуоткрытый интервал ( 1 - ^ 10
будет нумеровать от 1 до 9).