如何在列表中搜索,如果没有找到选择最近的最高价值长生不老药

how to search in a list and if not found choose the nearest highest value elixir

我有这两个列表。

一个列表是:

[~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.jpg20_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

更新:

同时具有

的值
values =
["00_08_000.jpg", "00_18_000.jpg", "00_28_000.jpg", "00_38_000.jpg",
 "00_48_000.jpg", "00_58_000.jpg", "01_08_000.jpg", "01_18_000.jpg",
 "01_28_000.jpg", "01_38_000.jpg", "01_48_000.jpg", "01_58_000.jpg",
 "02_08_000.jpg", "02_18_000.jpg", "02_28_000.jpg", "02_38_000.jpg",
 "02_48_000.jpg", "02_58_000.jpg", "03_08_000.jpg", "03_18_000.jpg",
 "03_28_000.jpg", "03_38_000.jpg", "03_48_000.jpg", "03_58_000.jpg",
 "04_08_000.jpg", "04_18_000.jpg", "04_28_000.jpg", "04_38_000.jpg",
 "04_48_000.jpg", "04_58_000.jpg", "05_08_000.jpg", "05_18_000.jpg",
 "05_28_000.jpg", "05_38_000.jpg", "05_48_000.jpg", "05_58_000.jpg",
 "06_08_000.jpg", "06_18_000.jpg", "06_28_000.jpg", "06_38_000.jpg",
 "06_48_000.jpg", "06_58_000.jpg", "07_08_000.jpg", "07_18_000.jpg",
 "07_28_000.jpg", "07_38_000.jpg", "07_48_000.jpg", "07_58_000.jpg",
 "08_08_000.jpg", "08_18_000.jpg", "08_28_000.jpg", "08_38_000.jpg",
 "08_48_000.jpg", "08_58_000.jpg", "09_08_000.jpg", "09_18_000.jpg",
 "09_28_000.jpg", "09_38_000.jpg", "09_48_000.jpg", "09_58_000.jpg",
 "10_08_000.jpg", "10_18_000.jpg", "10_28_000.jpg", "10_38_000.jpg",
 "10_48_000.jpg", "10_58_000.jpg", "11_08_000.jpg", "11_18_000.jpg",
 "11_28_000.jpg", "11_38_000.jpg", "11_48_000.jpg", "11_58_000.jpg",
 "12_08_000.jpg", "12_18_000.jpg", "12_28_000.jpg", "12_38_000.jpg",
 "12_48_000.jpg", "12_58_000.jpg", "13_08_000.jpg", "13_18_000.jpg",
 "13_28_000.jpg", "13_38_000.jpg", "13_48_000.jpg", "13_58_000.jpg",
 "14_08_000.jpg", "14_18_000.jpg", "14_28_000.jpg", "14_38_000.jpg",
 "14_48_000.jpg", "14_58_000.jpg", "15_08_000.jpg", "15_18_000.jpg",
 "15_28_000.jpg", "15_38_000.jpg", "15_48_000.jpg", "15_58_000.jpg",
 "16_08_000.jpg", "16_18_000.jpg", "16_28_000.jpg", "16_38_000.jpg",
 "16_48_000.jpg", "16_58_000.jpg", "17_08_000.jpg", "17_18_000.jpg",
 "17_28_000.jpg", "17_38_000.jpg", "17_48_000.jpg", "17_58_000.jpg",
 "18_08_000.jpg", "18_18_000.jpg", "18_28_000.jpg", "18_38_000.jpg",
 "18_48_000.jpg", "18_58_000.jpg", "19_08_000.jpg", "19_18_000.jpg",
 "19_28_000.jpg", "19_38_000.jpg", "19_48_000.jpg", "19_58_000.jpg",
 "20_08_000.jpg", "20_18_000.jpg", "20_28_000.jpg", "20_38_000.jpg",
 "20_48_000.jpg", "20_58_000.jpg", "21_08_000.jpg", "21_18_000.jpg",
 "21_28_000.jpg", "21_38_000.jpg", "21_48_000.jpg", "21_58_000.jpg",
 "22_08_000.jpg", "22_18_000.jpg", "22_28_000.jpg", "22_38_000.jpg",
 "22_48_000.jpg", "22_58_000.jpg", "23_08_000.jpg", "23_18_000.jpg",
 "23_28_000.jpg", "23_38_000.jpg", "23_48_000.jpg", "23_58_000.jpg",
 "24_08_000.jpg", "24_18_000.jpg", "24_28_000.jpg", "24_38_000.jpg",
 "24_48_000.jpg", "24_58_000.jpg", "25_08_000.jpg", "25_18_000.jpg",
 "25_28_000.jpg", "25_38_000.jpg", "25_48_000.jpg", "25_58_000.jpg",
 "26_08_000.jpg", "26_18_000.jpg", "26_28_000.jpg", "26_38_000.jpg",
 "26_48_000.jpg", "26_58_000.jpg", "27_08_000.jpg", "27_18_000.jpg",
 "27_28_000.jpg", "27_38_000.jpg", "27_48_000.jpg", "27_58_000.jpg",
 "28_08_000.jpg", "28_18_000.jpg", "28_28_000.jpg", "28_38_000.jpg",
 "28_48_000.jpg", "28_58_000.jpg", "29_08_000.jpg", "29_18_000.jpg",
 "29_28_000.jpg", "29_38_000.jpg", "29_48_000.jpg", "29_58_000.jpg",
 "30_08_000.jpg", "30_18_000.jpg", "30_28_000.jpg", "30_38_000.jpg",
 "30_48_000.jpg", "30_58_000.jpg", "31_08_000.jpg", "31_18_000.jpg",
 "31_28_000.jpg", "31_38_000.jpg", "31_48_000.jpg", "31_58_000.jpg",
 "32_08_000.jpg", "32_18_000.jpg", "32_28_000.jpg", "32_38_000.jpg",
 "32_48_000.jpg", "32_58_000.jpg", "33_08_000.jpg", "33_18_000.jpg",
 "33_28_000.jpg", "33_38_000.jpg", "33_48_000.jpg", "33_58_000.jpg",
 "34_08_000.jpg", "34_18_000.jpg", "34_28_000.jpg", "34_38_000.jpg",
 "34_48_000.jpg", "34_58_000.jpg", "35_08_000.jpg", "35_18_000.jpg", 
 "35_28_000.jpg", "35_38_000.jpg", "35_48_000.jpg", "35_58_000.jpg",
 "36_08_000.jpg", "36_18_000.jpg", "36_28_000.jpg", "36_38_000.jpg",
 "36_48_000.jpg", "36_58_000.jpg", "37_08_000.jpg", "37_18_000.jpg",
 "37_28_000.jpg", "37_38_000.jpg", "37_48_000.jpg", "37_58_000.jpg",
 "38_08_000.jpg", "38_18_000.jpg", "38_28_000.jpg", "38_38_000.jpg",
 "38_48_000.jpg", "38_58_000.jpg", "39_08_000.jpg", "39_18_000.jpg",
 "39_28_000.jpg", "39_38_000.jpg", "39_48_000.jpg", "39_58_000.jpg",
 "40_08_000.jpg", "40_18_000.jpg", "40_28_000.jpg", "40_38_000.jpg",
 "40_48_000.jpg", "40_58_000.jpg", "41_08_000.jpg", "41_18_000.jpg",
 "41_28_000.jpg", "41_38_000.jpg", "41_48_000.jpg", "41_58_000.jpg",
 "42_08_000.jpg", "42_18_000.jpg", "42_28_000.jpg", "42_38_000.jpg",
 "42_48_000.jpg", "42_58_000.jpg", "43_08_000.jpg", "43_18_000.jpg",
 "43_28_000.jpg", "43_38_000.jpg", "43_48_000.jpg", "43_58_000.jpg",
 "44_08_000.jpg", "44_18_000.jpg", "44_28_000.jpg", "44_38_000.jpg",
 "44_48_000.jpg", "44_58_000.jpg", "45_08_000.jpg", "45_18_000.jpg",
 "45_28_000.jpg", "45_38_000.jpg", "45_48_000.jpg", "45_58_000.jpg",
 "46_08_000.jpg", "46_18_000.jpg", "46_28_000.jpg", "46_38_000.jpg",
 "46_48_000.jpg", "46_58_000.jpg", "47_08_000.jpg", "47_18_000.jpg",
 "47_28_000.jpg", "47_38_000.jpg", "47_48_000.jpg", "47_58_000.jpg",
 "48_08_000.jpg", "48_18_000.jpg", "48_28_000.jpg", "48_38_000.jpg",
 "48_48_000.jpg", "48_58_000.jpg", "49_08_000.jpg", "49_18_000.jpg",
 "49_28_000.jpg", "49_38_000.jpg", "49_48_000.jpg", "49_58_000.jpg",
 "50_08_000.jpg", "50_18_000.jpg", "50_28_000.jpg", "50_38_000.jpg",
 "50_48_000.jpg", "50_58_000.jpg", "51_08_000.jpg", "51_18_000.jpg",
 "51_28_000.jpg", "51_38_000.jpg", "51_48_000.jpg", "51_58_000.jpg",
 "52_08_000.jpg", "52_18_000.jpg", "52_28_000.jpg", "52_38_000.jpg",
 "52_48_000.jpg", "52_58_000.jpg", "53_08_000.jpg", "53_18_000.jpg",
 "53_28_000.jpg", "53_38_000.jpg", "53_48_000.jpg", "53_58_000.jpg",
 "54_08_000.jpg", "54_18_000.jpg", "54_28_000.jpg", "54_38_000.jpg",
 "54_48_000.jpg", "54_58_000.jpg", "55_08_000.jpg", "55_18_000.jpg",
 "55_28_000.jpg", "55_38_000.jpg", "55_48_000.jpg", "55_58_000.jpg",
 "56_08_000.jpg", "56_18_000.jpg", "56_28_000.jpg", "56_38_000.jpg",
 "56_48_000.jpg", "56_58_000.jpg", "57_08_000.jpg", "57_18_000.jpg",
 "57_28_000.jpg", "57_38_000.jpg", "57_48_000.jpg", "57_58_000.jpg",
 "58_08_000.jpg", "58_18_000.jpg", "58_28_000.jpg", "58_38_000.jpg",
 "58_48_000.jpg", "58_58_000.jpg", "59_08_000.jpg", "59_18_000.jpg",
 "59_28_000.jpg", "59_38_000.jpg", "59_48_000.jpg", "59_58_000.jpg"]

并列为

list =
["24_00_000.jpg", "24_01_000.jpg", "24_02_000.jpg", "24_03_000.jpg",
 "24_04_000.jpg", "24_05_000.jpg", "24_06_000.jpg", "24_07_000.jpg",
 "24_08_000.jpg", "24_09_000.jpg", "24_10_000.jpg", "24_11_000.jpg",
 "24_12_000.jpg", "24_13_000.jpg", "24_14_000.jpg", "24_15_000.jpg",
 "24_16_000.jpg", "24_17_000.jpg", "24_18_000.jpg", "24_19_000.jpg",
 "24_20_000.jpg", "24_21_000.jpg", "24_22_000.jpg", "24_23_000.jpg",
 "24_24_000.jpg", "24_25_000.jpg", "24_26_000.jpg", "24_27_000.jpg",
 "24_28_000.jpg", "24_29_000.jpg", "24_30_000.jpg", "24_31_000.jpg",
 "24_32_000.jpg", "24_33_000.jpg", "24_34_000.jpg", "24_35_000.jpg",
 "24_36_000.jpg", "24_37_000.jpg", "24_38_000.jpg", "24_39_000.jpg",
 "24_40_000.jpg", "24_41_000.jpg", "24_42_000.jpg", "24_43_000.jpg",
 "24_44_000.jpg", "24_45_000.jpg", "24_46_000.jpg", "24_47_000.jpg",
 "24_48_000.jpg", "24_49_000.jpg", "24_50_000.jpg", "24_51_000.jpg",
 "24_52_000.jpg", "24_53_000.jpg", "24_54_000.jpg", "24_55_000.jpg",
 "24_56_000.jpg", "24_57_000.jpg", "24_58_000.jpg", "24_59_000.jpg",
 "25_00_000.jpg", "25_01_000.jpg", "25_02_000.jpg", "25_03_000.jpg",
 "25_04_000.jpg", "25_05_000.jpg", "25_06_000.jpg", "25_07_000.jpg",
 "25_08_000.jpg", "25_09_000.jpg", "25_10_000.jpg", "25_11_000.jpg",
 "25_12_000.jpg", "25_13_000.jpg", "25_14_000.jpg", "25_15_000.jpg",
 "25_16_000.jpg", "25_17_000.jpg", "25_18_000.jpg", "25_19_000.jpg",
 "25_20_000.jpg", "25_21_000.jpg", "25_22_000.jpg", "25_23_000.jpg",
 "25_24_000.jpg", "25_25_000.jpg", "25_26_000.jpg", "25_27_000.jpg",
 "25_28_000.jpg", "25_29_000.jpg", "25_30_000.jpg", "25_31_000.jpg",
 "25_32_000.jpg", "25_33_000.jpg", "25_34_000.jpg", "25_35_000.jpg",
 "25_36_000.jpg", "25_37_000.jpg", "25_38_000.jpg", "25_39_000.jpg",
 "25_40_000.jpg", "25_41_000.jpg", "25_42_000.jpg", "25_43_000.jpg",
 "25_44_000.jpg", "25_45_000.jpg", "25_46_000.jpg", "25_47_000.jpg",
 "25_48_000.jpg", "25_49_000.jpg", "25_50_000.jpg", "25_51_000.jpg",
 "25_52_000.jpg", "25_53_000.jpg", "25_54_000.jpg", "25_55_000.jpg",
 "25_56_000.jpg", "25_57_000.jpg", "25_58_000.jpg", "25_59_000.jpg",
 "26_00_000.jpg"]

以下解决方案无效。

最快的方法是同时减少长列表 短列表。

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"]