Nano Hash - криптовалюты, майнинг, программирование

Заменить ключ во вложенных картах

Как я могу заменить все ключи во вложенной карте другим ключом, не зная пути (или заменить ключи, соответствующие шаблону), например:

Map = #{foo => #{bar => 1, foo => #{bar => 2}}}.
Map2 = maps:keyreplace(bar, foo, Map).
>>> #{foo => #{foo => 1, foo => #{foo => 2}}}

Как это сделать наиболее эффективно?
Замена ключа на плоской карте кажется довольно простой:

keyreplace(K1, K2, M) when is_map(M) ->
    case maps:take(K1, M) of
        {V, M2} ->
            maps:put(K2, V, M2);
        error -> M
    end.

Или вот так, может быть:

keymap(F, Map) ->
    maps:fold(fun(K, V, Acc) ->
        maps:put(F(K), V, Acc)
    end, #{}, Map).
Map = #{foo => 1, bar => 2}.
Fun = fun(K) -> atom_to_list(K) end.
Map2 = keymap(Fun, Map).
>>> #{"bar" => 2,"foo" => 1}
12.12.2017

Ответы:


1

Я написал рекурсивную функцию, которую вы можете использовать для достижения своей цели, она принимает 3 аргумента:

Is_matched — функция, в которой вы проверяете соответствие ключа вашему шаблону.

Convert - функция, которая конвертирует ключ по вашему желанию.

Карта - карта для обработки.

replace_keys(Is_matched, Convert, Map) when is_map(Map) ->
  maps:fold(fun (K, V, AccIn) ->
    NewKey =
      case Is_matched(K) of
        true -> Convert(K);
        false -> K
      end,
    maps:put(NewKey, replace_keys(Is_matched, Convert, V), AccIn)
  end, #{}, Map);

replace_keys(_, _, Term) -> Term. 

Пример:

1> Map = #{a => "1", <<"b">> => #{c => "2", <<"d">> => 3}}.            
#{a => "1",<<"b">> => #{c => "2",<<"d">> => 3}}
2> Is_matched = fun(Term) -> is_atom(Term) end.
#Fun<erl_eval.6.99386804>
3> Convert = fun(Term) -> atom_to_list(Term) end.
#Fun<erl_eval.6.99386804>
4> keyreplace:replace_keys(Is_matched, Convert, Map).
#{"a" => "1",<<"b">> => #{"c" => "2",<<"d">> => 3}}
12.12.2017

2

Это можно сделать с некоторыми изменениями в вашей maps:fold попытке:

  1. Если третий аргумент не является картой, верните его как есть.
  2. When folding:
    1. Recursively call the function with the value field to obtain the new value.
    2. Если ключ соответствует K1, поместите новое значение в K2.

Вывод вашего примера неверен - он имеет 2 значения для ключа foo. Я изменил его в тесте ниже.

keyreplace(K1, K2, Map) when is_map(Map) ->
  maps:fold(fun(K, V, Acc) ->
    Key = if K == K1 -> K2; true -> K end,
    Value = keyreplace(K1, K2, V),
    maps:put(Key, Value, Acc)
  end, #{}, Map);
keyreplace(_K1, _K2, Term) -> Term.
1> c(a).
{ok,a}
2> Map = #{foo => #{bar => 1, baz => #{bar => 2}}}.
#{foo => #{bar => 1,baz => #{bar => 2}}}
3> a:keyreplace(bar, foo, Map).
#{foo => #{baz => #{foo => 2},foo => 1}}
12.12.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..