# Sort keys of NamedTuple

**URL:** <https://discourse.julialang.org/t/sort-keys-of-namedtuple/94630>\
**Category:** General Usage\
**Tags:** sort, namedtuple\
**Created:** [February 14, 2023, 3:58pm UTC](https://discourse.julialang.org/t/sort-keys-of-namedtuple/94630 "2023-02-14T15:58:03Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![jw3126](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jw3126/32/3086_2.png) [@jw3126](https://discourse.julialang.org/u/jw3126)\
**Post date:** [February 14, 2023, 3:58pm UTC](https://discourse.julialang.org/t/sort-keys-of-namedtuple/94630/1 "2023-02-14T15:58:03Z")

</div>

I would like to sort a NamedTuple alphabetically by its keys. For instance:

```julia
(b=1, a=2, c=3) ---> (a=2, b=1, c=3)
(a=1, c=2, b=3) ---> (a=1, b=3, c=2)

```

I am pretty sure such functionality already exists, where to look for it? Bonus points if the solutions infers.

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [February 14, 2023, 4:12pm UTC](https://discourse.julialang.org/t/sort-keys-of-namedtuple/94630/2 "2023-02-14T16:12:45Z")

</div>

Not sure if this is reasonable:

```julia
using TupleTools
nt = (b=1, a=2, c=3)
NamedTuple{TupleTools.sort(keys(nt))}(nt)
# result:
(a = 2, b = 1, c = 3)

```

---

<div class="post-metadata">

**Author:** ![aplavin](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/aplavin/32/222056_2.png) [@aplavin](https://discourse.julialang.org/u/aplavin)\
**Post date:** [February 15, 2023, 10:17am UTC](https://discourse.julialang.org/t/sort-keys-of-namedtuple/94630/3 "2023-02-15T10:17:43Z")

</div>

Dependency-free, infers, compiles to basically a no-op:

```julia
@generated sortkeys(nt::NamedTuple{KS}) where {KS} =
    :( NamedTuple{$(Tuple(sort(collect(KS))))}(nt) )

```

---

<div class="post-metadata">

**Author:** ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)\
**Post date:** [February 15, 2023, 12:50pm UTC](https://discourse.julialang.org/t/sort-keys-of-namedtuple/94630/4 "2023-02-15T12:50:38Z")

</div>

could you please explain how it works in some detail?  
For example, where does it happen that in addition to sorting the keys the values are also correspondingly sorted?

---

<div class="post-metadata">

**Author:** ![tbeason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tbeason/32/15898_2.png) [@tbeason](https://discourse.julialang.org/u/tbeason)\
**Post date:** [February 15, 2023, 3:17pm UTC](https://discourse.julialang.org/t/sort-keys-of-namedtuple/94630/5 "2023-02-15T15:17:13Z")

</div>

Both of those solutions work in the same manner.

```julia
julia> nt = (b=1, a=2, c=3)
(b = 1, a = 2, c = 3)

julia> typeof(nt)
NamedTuple{(:b, :a, :c), Tuple{Int64, Int64, Int64}}

julia> NamedTuple{(:a,:b,:c)}(nt)
(a = 2, b = 1, c = 3)

```

The last line works because of (from `? NamedTuple`)

```julia
NamedTuple{names}(nt::NamedTuple)

  Construct a named tuple by selecting fields in names (a tuple of Symbols) from another named tuple.

```

---

<div class="post-metadata">

**Author:** ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)\
**Post date:** [February 15, 2023, 5:41pm UTC](https://discourse.julialang.org/t/sort-keys-of-namedtuple/94630/6 "2023-02-15T17:41:20Z")

</div>

> [@tbeason](#):
>
> ```julia
> julia> NamedTuple{(:a,:b,:c)}(nt)
> (a = 2, b = 1, c = 3)
> 
> ```

Very interesting.  
Now I can understand at least part of @aplavin solution  
Seems to work for some of the fields as well.

```julia
 NamedTuple{(:c,:b)}(nt)

```
