israelcastilloh

israelcastilloh

How to nest a list into a map?

Hey guys!

I have a single list like this:

[x, y, [1], [2] ... w, z, [3], [4] ... ]

My question is how could i recreate a map which assigns the first 2 as nested maps (or as keys) and the lists within the list as values of the nested maps. Such as it could be expressed as

[ key: x [ key: y, value: [1] [2] ] ]
[ key: w [ key: z value: [3] [4] ] ]

Where 1 and 2 belongs to y which belongs to x.
Where 3 and 4 belongs to z which belongs to w.

Does anyone have an idea how to do this in Elixir?

I am more knowledgeable on python dictionaries. So I was thinking on choosing those elements inside the first list that are “not-list” (x, w) an assign them as keys, and those inside a list (1,2) as values.

First 10 of 10 Posts Switch mode

fuelen

fuelen

Hello!

Sorry, I do not fully understand your pseudo code.
Could you express desired input and output using elixir terms?

israelcastilloh

israelcastilloh

Yes!

[
  "JUZGADO PRIMERO CIVIL DE ENSENADA, B.C. 30 DE JULIO DE 2020",
  "PRIMERA SECRETARIA",
  "Acuerdos",
  ["1", "00268/2016",
   "ROSARIO MEDA MONROY Y OTRAS    VS ANTONIETA GONZALEZ DE CROSTHWAITE TAMBIEN CONOCIDA COMO MARIA ANTONIETA GONZALEZ VIUDA DE CROSTHWAITE ORDINARIO CIVIL PRESCRIPCION POSITIVA"],
  ["2", "00319/2017",
   "SUCESION INTESTAMENTARIA A BIENES DE, GABRIELA ACEVEDO AMADOR. SUCESORIO INTESTAMENTARIO"],
  ["3", "00570/2017",
   "SUCESION TESTAMENTARIA A BIENES DE GUADALUPE RIOS ARRIAGA, TAMBIEN CONOCIDA COMO MARIA GUADALUPE RIOS ARRIAGA    VS REGISTRO PUBLICO DE LA PROPIEDAD Y DE COMERCIO Y OTROS ORDINARIO CIVIL PRESCRIPCION POSITIVA"],
...

I have this single list, that continues alternating between strings and lists. Which I would like to convert such as this:

[
  **key**: "JUZGADO PRIMERO CIVIL DE ENSENADA, B.C. 30 DE JULIO DE 2020",
  **key**: "PRIMERA SECRETARIA" : **key**: " Acuerdos" :  **values** ["1", "00268/2016",
   "ROSARIO MEDA MONROY Y OTRAS    VS ANTONIETA GONZALEZ DE CROSTHWAITE TAMBIEN CONOCIDA COMO MARIA ANTONIETA GONZALEZ VIUDA DE CROSTHWAITE ORDINARIO CIVIL PRESCRIPCION POSITIVA"],
  ["2", "00319/2017",
   "SUCESION INTESTAMENTARIA A BIENES DE, GABRIELA ACEVEDO AMADOR. SUCESORIO INTESTAMENTARIO"] ...

Keep in mind that the initial structure repeats between strings and lists. The former being the values. While the first needs to be taken as keys of the map, and nest them if they are followed by consecutive keys.

al2o3cr

al2o3cr

TBH I think you’d be better served by parsing the source of that data more carefully; whatever’s producing this list of strings has flattened a lot of the structure out of it:

http://www.pjbc.gob.mx/boletinj/2020/my_html/en200803.htm

israelcastilloh

israelcastilloh

I agree. Let me check if I can do this. Any ideas to workaround what I have?
I know in Python we could do dictionaries, I was thinking about doing the same in Elixir with maps.

fuelen

fuelen

defmodule Test do
  def data do
    [
      "JUZGADO PRIMERO CIVIL DE ENSENADA, B.C. 30 DE JULIO DE 2020",
      "PRIMERA SECRETARIA",
      "Acuerdos",
      [
        "1",
        "00268/2016",
        "ROSARIO MEDA MONROY Y OTRAS    VS ANTONIETA GONZALEZ DE CROSTHWAITE TAMBIEN CONOCIDA COMO MARIA ANTONIETA GONZALEZ VIUDA DE CROSTHWAITE ORDINARIO CIVIL PRESCRIPCION POSITIVA"
      ],
      ["2", "00319/2017", "SUCESION INTESTAMENTARIA A BIENES DE, GABRIELA ACEVEDO AMADOR. SUCESORIO INTESTAMENTARIO"],
      [
        "3",
        "00570/2017",
        "SUCESION TESTAMENTARIA A BIENES DE GUADALUPE RIOS ARRIAGA, TAMBIEN CONOCIDA COMO MARIA GUADALUPE RIOS ARRIAGA    VS REGISTRO PUBLICO DE LA PROPIEDAD Y DE COMERCIO Y OTROS ORDINARIO CIVIL PRESCRIPCION POSITIVA"
      ],
      "one",
      "two",
      ["1", "date"],
      ["2", "date"]
    ]
  end

  def process(input, acc \\ %{}) do
    {keys, tail} = Enum.split_while(input, &is_binary/1)
    {values, tail} = Enum.split_while(tail, &is_list/1)
    acc = put_in(acc, Enum.map(keys, &Access.key(&1, %{})), values)

    case tail do
      [] -> acc
      _ -> process(tail, acc)
    end
  end
end

and output

> Test.process(Test.data())
%{
  "JUZGADO PRIMERO CIVIL DE ENSENADA, B.C. 30 DE JULIO DE 2020" => %{
    "PRIMERA SECRETARIA" => %{
      "Acuerdos" => [
        ["1", "00268/2016",
         "ROSARIO MEDA MONROY Y OTRAS    VS ANTONIETA GONZALEZ DE CROSTHWAITE TAMBIEN CONOCIDA COMO MARIA ANTONIETA GONZALEZ VIUDA DE CROSTHWAITE ORDINARIO CIVIL PRESCRIPCION POSITIVA"],
        ["2", "00319/2017",
         "SUCESION INTESTAMENTARIA A BIENES DE, GABRIELA ACEVEDO AMADOR. SUCESORIO INTESTAMENTARIO"],
        ["3", "00570/2017",
         "SUCESION TESTAMENTARIA A BIENES DE GUADALUPE RIOS ARRIAGA, TAMBIEN CONOCIDA COMO MARIA GUADALUPE RIOS ARRIAGA    VS REGISTRO PUBLICO DE LA PROPIEDAD Y DE COMERCIO Y OTROS ORDINARIO CIVIL PRESCRIPCION POSITIVA"]
      ]
    }
  },
  "one" => %{"two" => [["1", "date"], ["2", "date"]]}
}

Is this a structure you are looking for?

israelcastilloh

israelcastilloh

Precisely! Amazing, thank you. Let me check and I’ll get back to you.

israelcastilloh

israelcastilloh

Any idea how to avoid the json being modified alphabetically?

NobbZ

NobbZ

Which JSON?

If you are talking about JSON objects, their keys have no order.

israelcastilloh

israelcastilloh

Instead of this :

%{
  "JUZGADO PRIMERO CIVIL DE ENSENADA, B.C. 30 DE JULIO DE 2020" => %{
    "PRIMERA SECRETARIA" => %{
      "Acuerdos" => [
        ["1", "00268/2016",
         "ROSARIO MEDA MONROY Y OTRAS    VS ANTONIETA GONZALEZ DE CROSTHWAITE TAMBIEN CONOCIDA COMO MARIA ANTONIETA GONZALEZ VIUDA DE CROSTHWAITE ORDINARIO CIVIL PRESCRIPCION POSITIVA"],
        ["2", "00319/2017",
         "SUCESION INTESTAMENTARIA A BIENES DE, GABRIELA ACEVEDO AMADOR. SUCESORIO INTESTAMENTARIO"],
        ["3", "00570/2017",
         "SUCESION TESTAMENTARIA A BIENES DE GUADALUPE RIOS ARRIAGA, TAMBIEN CONOCIDA COMO MARIA GUADALUPE RIOS ARRIAGA    VS REGISTRO PUBLICO DE LA PROPIEDAD Y DE COMERCIO Y OTROS ORDINARIO CIVIL PRESCRIPCION POSITIVA"]
      ]
    }
  },

But after expanding the usability of the code it begins to map my “keys” on alphabetical order. Sorry for the basic questions, I am still learning Elixir.

NobbZ

NobbZ

That’s not JSON, that’s an elixir map.

It doesn’t imply any ordering of keys as well.

For small maps it might sometimes look like the keys are in order of insertion, but this is due to an implementation detail.

It is better to not assume any order in maps.

— All posts loaded —

Where Next?

Trending in Questions Top

jonnycharles
I’m in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
spammy
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
silverdr
Using Phoenix.LiveView.TagEngine as an EEx.Engine is deprecated! To compile HEEx, use Phoenix.LiveView.TagEngine.compile/2 instead. Sta...
New
saveman71
Hello ! We want new/edit form pages to POST/PUT to their own URL rather than the resources REST defaults (post /things, put /things/:id)...
New
dli
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app? Looking for hints regarding: Addi...
New
bottlenecked
Hi all, I wanted to ask how the community is dealing with post-release steps. Today we have Ecto migrations, which make sure that the db...
New
michallepicki
I am using Oban and occasionally, shortly after a deployment, a handful of jobs can fail because of dependency on other parts of the syst...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
type1fool
I just stumbled on a newly redesigned elixir-lang.org. :tada: It looks like @Software_Mansion did the work, and I think it is generally a...
New
akoutmos
@hugobarauna and I (Alex Koutmos) have been hard at work on writing a book on Nerves that takes you from simply blinking LEDs to building...
New

We're in Beta

About us Mission Statement