How to unfold a set of tuples?

I have a set of tuples something like A = [(1,2),(,7,10),(3,2),(9,8),(5,1)] and wanted to unwrap them into a set. So, for “A” output would be like B = {1,2,3,5,7,8,9,10}

Is there any way to do this (without using for loop, ideally)?

What about

reduce(union, Set.(A))

Set(Iterators.flatten(A)) gets you there.


Any clues why unique(Iterators.flatten(A)) is so much slower than Set?

Well, it allocates an array in addition to (internally) creating a Set.

1 Like

is much faster than:


what is then the point of unique?

It preserves the order of the elements. collect(Set(...)) does not.

1 Like

Thanks Steve. The order is not the first thing that comes to mind from the unique name, but you and the manual never lie.

Is it?

julia> @btime collect(Set(Iterators.flatten($A)))
  204.793 ns (5 allocations: 528 bytes)

julia> @btime unique(Iterators.flatten($A))
  227.554 ns (6 allocations: 544 bytes)

It is:

A = [(rand(Int8), rand(Int8)) for _ in 1:10_000]

Set(Iterators.flatten(A))           #  11 μs ( 7 allocs: 1.4 KiB)
collect(Set(Iterators.flatten(A)))  #  13 μs ( 8 allocs: 1.7 KiB)
unique(Iterators.flatten(A))        # 121 μs (18 allocs: 4.5 KiB)