как искать в списке и, если не нашел, выбрать ближайший эликсир с наивысшей ценностью - PullRequest
0 голосов
/ 25 мая 2020

У меня есть эти 2 списка.

один список:

[~U[2020-05-20 11:00:00.123456Z], ~U[2020-05-20 11:20:00.123456Z],
 ~U[2020-05-20 11:40:00.123456Z]]

, а второй список:

["00_02_000.jpg", "00_06_000.jpg", "00_14_000.jpg", "00_18_000.jpg",
 "00_22_000.jpg", "00_30_000.jpg", "00_34_000.jpg", "00_38_000.jpg",
 "00_42_000.jpg", "00_46_000.jpg", "00_54_000.jpg", "00_58_000.jpg",
 "01_02_000.jpg", "01_10_000.jpg", "01_14_000.jpg", "01_18_000.jpg",
 "01_22_000.jpg", "01_30_000.jpg", "01_34_000.jpg", "01_38_000.jpg",
 "01_42_000.jpg", "01_50_000.jpg", "01_54_000.jpg", "01_58_000.jpg",
 "02_02_000.jpg", "02_06_000.jpg", "02_25_000.jpg", "02_29_000.jpg",
 "02_33_000.jpg", "02_41_000.jpg", "02_45_000.jpg", "02_49_000.jpg",
 "02_53_000.jpg", "03_01_000.jpg", "03_05_000.jpg", "03_09_000.jpg",
 "03_13_000.jpg", "03_21_000.jpg", "03_25_000.jpg", "03_29_000.jpg",
 "03_33_000.jpg", "03_41_000.jpg", "03_45_000.jpg", "03_49_000.jpg",
 "03_53_000.jpg", "04_01_000.jpg", "04_05_000.jpg", "04_09_000.jpg",
 "04_13_000.jpg", "04_21_000.jpg", ...]

Теперь я сначала хочу преобразовать первый список в.

["00_00_000.jpg", "20_00_000.jpg", "40_00_000.jpg"]

, который выполняется через strftime.

, а затем я хочу создать третий список. размера 3, который либо включает только

["00_00_000.jpg", "20_00_000.jpg", "40_00_000.jpg"]

, если он присутствует во втором списке.

, если его нет во втором списке, выберите следующее его значение. пример

в приведенном выше списке нет 00_00_000.jpg Поэтому я хочу выбрать 00_02_000.jpg то же, что и для 20_00_000.jpg

Обновление: в результате список должен быть таким

["00_00_000.jpg", "20_00_000.jpg", "40_00_000.jpg"]

самых вложенных значений этих 3. таких

значений. следующее значение для "00_00_000.jpg" - "00_02_000.jpg", как если бы 20_00_000.jpg не существует, следующим может быть 21_00_000.jpg

1 Ответ

0 голосов
/ 25 мая 2020

Самый быстрый способ - сократить одновременно длинный список и короткий список.

values =
["00_02_000.jpg", "00_06_000.jpg", "00_14_000.jpg", "00_18_000.jpg",
 "00_22_000.jpg", "00_30_000.jpg", "00_34_000.jpg", "00_38_000.jpg",
 "00_42_000.jpg", "00_46_000.jpg", "00_54_000.jpg", "00_58_000.jpg",
 "01_02_000.jpg", "01_10_000.jpg", "01_14_000.jpg", "01_18_000.jpg",
 "01_22_000.jpg", "01_30_000.jpg", "01_34_000.jpg", "01_38_000.jpg",
 "01_42_000.jpg", "01_50_000.jpg", "01_54_000.jpg", "01_58_000.jpg",
 "02_02_000.jpg", "02_06_000.jpg", "02_25_000.jpg", "02_29_000.jpg",
 "02_33_000.jpg", "02_41_000.jpg", "02_45_000.jpg", "02_49_000.jpg",
 "02_53_000.jpg", "03_01_000.jpg", "03_05_000.jpg", "03_09_000.jpg",
 "03_13_000.jpg", "03_21_000.jpg", "03_25_000.jpg", "03_29_000.jpg",
 "03_33_000.jpg", "03_41_000.jpg", "03_45_000.jpg", "03_49_000.jpg",
 "03_53_000.jpg", "04_01_000.jpg", "04_05_000.jpg", "04_09_000.jpg",
 "04_13_000.jpg", "04_21_000.jpg"]

list = Enum.sort(["00_00_000.jpg", "02_01_000.jpg", "04_01_000.jpg"])

values
|> Enum.reduce_while({list, []}, fn
  _, {[], acc} -> {:halt, acc}
  e, {[h|t], acc} ->
    {:cont, 
      if(String.split(e, ~w[_ .]) < String.split(h, ~w[_ .]),
        do: {[h|t], acc},
        else: {t, [e | acc]})
    }
end)
|> Enum.reverse()

#⇒ ["00_02_000.jpg", "02_02_000.jpg", "04_01_000.jpg"]

По сути, здесь мы просматриваем длинный список, и как только мы встречаемся с значение, которое больше или равно текущему заголовку в коротком списке, мы оба вводим его в аккумулятор и удаляем из короткого списка .


Если производительность не критична, решение с сопоставлением короткого списка с первым из длинного списка, вероятно, будет легче читать и поддерживать.

Enum.map(list, fn e ->
  Enum.find(values,
    &(String.split(e, ~w[_ .]) <= String.split(&1, ~w[_ .])))
end)
#⇒ ["00_02_000.jpg", "02_02_000.jpg", "04_01_000.jpg"]
...