Collections and Data Structures¶
Iteration¶
Sequential iteration is implemented by the methods start, done, and
next. The general for loop:
for i = I # or "for i in I"
# body
end
is translated to:
state = start(I)
while !done(I, state)
(i, state) = next(I, state)
# body
end
The state object may be anything, and should be chosen appropriately for each iterable type.
-
start(iter) → state¶ Get initial iteration state for an iterable object
-
done(iter, state) → Bool¶ Test whether we are done iterating
-
next(iter, state) → item, state¶ For a given iterable object and iteration state, return the current item and the next iteration state
-
zip(iters...)¶ For a set of iterable objects, returns an iterable of tuples, where the
ith tuple contains theith component of each input iterable.Note that
zipis its own inverse:[zip(zip(a...)...)...] == [a...].
-
enumerate(iter)¶ Return an iterator that yields
(i, x)whereiis an index starting at 1, andxis theith value from the given iterator. It’s useful when you need not only the valuesxover which you are iterating, but also the indexiof the iterations.julia> a = ["a", "b", "c"]; julia> for (index, value) in enumerate(a) println("$index $value") end 1 a 2 b 3 c
Fully implemented by: Range, UnitRange, NDRange, Tuple, Real, AbstractArray, IntSet, ObjectIdDict, Dict, WeakKeyDict, EachLine, String, Set, Task.
General Collections¶
-
isempty(collection) → Bool¶ Determine whether a collection is empty (has no elements).
julia> isempty([]) true julia> isempty([1 2 3]) false
-
empty!(collection) → collection¶ Remove all elements from a
collection.
-
length(collection) → Integer¶ For ordered, indexable collections, the maximum index
ifor whichgetindex(collection, i)is valid. For unordered collections, the number of elements.
-
endof(collection) → Integer¶ Returns the last index of the collection.
julia> endof([1,2,4]) 3
Fully implemented by: Range, UnitRange, Tuple, Number, AbstractArray, IntSet, Dict, WeakKeyDict, String, Set.
Iterable Collections¶
-
in(item, collection) → Bool¶ -
∈(item, collection) → Bool¶ -
∋(collection, item) → Bool¶ -
∉(item, collection) → Bool¶ -
∌(collection, item) → Bool¶ Determine whether an item is in the given collection, in the sense that it is
==to one of the values generated by iterating over the collection. Some collections need a slightly different definition; for example Sets check whether the item isisequalto one of the elements. Dicts look for(key,value)pairs, and the key is compared usingisequal. To test for the presence of a key in a dictionary, usehaskeyork in keys(dict).
-
eltype(collection)¶ Determine the type of the elements generated by iterating
collection. For associative collections, this will be a(key,value)tuple type.
-
indexin(a, b)¶ Returns a vector containing the highest index in
bfor each value inathat is a member ofb. The output vector contains 0 whereverais not a member ofb.
-
findin(a, b)¶ Returns the indices of elements in collection
athat appear in collectionb
-
unique(itr[, dim])¶ Returns an array containing only the unique elements of the iterable
itr, in the order that the first of each set of equivalent elements originally appears. Ifdimis specified, returns unique regions of the arrayitralongdim.
-
reduce(op, v0, itr)¶ Reduce the given collection
ìtrwith the given binary operatorop.v0must be a neutral element foropthat will be returned for empty collections. It is unspecified whetherv0is used for non-empty collections.Reductions for certain commonly-used operators have special implementations which should be used instead:
maximum(itr),minimum(itr),sum(itr),prod(itr),any(itr),all(itr).The associativity of the reduction is implementation-dependent. This means that you can’t use non-associative operations like
-because it is undefined whetherreduce(-,[1,2,3])should be evaluated as(1-2)-3or1-(2-3). Usefoldlorfoldrinstead for guaranteed left or right associativity.Some operations accumulate error, and parallelism will also be easier if the reduction can be executed in groups. Future versions of Julia might change the algorithm. Note that the elements are not reordered if you use an ordered collection.
-
reduce(op, itr) Like
reduce(op, v0, itr). This cannot be used with empty collections, except for some special cases (e.g. whenopis one of+,*,max,min,&,|) when Julia can determine the neutral element ofop.
-
foldl(op, v0, itr)¶ Like
reduce, but with guaranteed left associativity.v0will be used exactly once.
-
foldl(op, itr) Like
foldl(op, v0, itr), but using the first element ofitrasv0. In general, this cannot be used with empty collections (seereduce(op, itr)).
-
foldr(op, v0, itr)¶ Like
reduce, but with guaranteed right associativity.v0will be used exactly once.
-
foldr(op, itr) Like
foldr(op, v0, itr), but using the last element ofitrasv0. In general, this cannot be used with empty collections (seereduce(op, itr)).
-
maximum(itr)¶ Returns the largest element in a collection.
-
maximum(A, dims) Compute the maximum value of an array over the given dimensions.
-
maximum!(r, A)¶ Compute the maximum value of
Aover the singleton dimensions ofr, and write results tor.
-
minimum(itr)¶ Returns the smallest element in a collection.
-
minimum(A, dims) Compute the minimum value of an array over the given dimensions.
-
minimum!(r, A)¶ Compute the minimum value of
Aover the singleton dimensions ofr, and write results tor.
-
extrema(itr)¶ Compute both the minimum and maximum element in a single pass, and return them as a 2-tuple.
-
indmax(itr) → Integer¶ Returns the index of the maximum element in a collection.
-
indmin(itr) → Integer¶ Returns the index of the minimum element in a collection.
-
findmax(itr) -> (x, index)¶ Returns the maximum element and its index.
-
findmax(A, dims) -> (maxval, index) For an array input, returns the value and index of the maximum over the given dimensions.
-
findmin(itr) -> (x, index)¶ Returns the minimum element and its index.
-
findmin(A, dims) -> (minval, index) For an array input, returns the value and index of the minimum over the given dimensions.
-
maxabs(itr)¶ Compute the maximum absolute value of a collection of values.
-
maxabs(A, dims) Compute the maximum absolute values over given dimensions.
-
maxabs!(r, A)¶ Compute the maximum absolute values over the singleton dimensions of
r, and write values tor.
-
minabs(itr)¶ Compute the minimum absolute value of a collection of values.
-
minabs(A, dims) Compute the minimum absolute values over given dimensions.
-
minabs!(r, A)¶ Compute the minimum absolute values over the singleton dimensions of
r, and write values tor.
-
sum(itr)¶ Returns the sum of all elements in a collection.
-
sum(A, dims) Sum elements of an array over the given dimensions.
-
sum!(r, A)¶ Sum elements of
Aover the singleton dimensions ofr, and write results tor.
-
sum(f, itr) Sum the results of calling function
fon each element ofitr.
-
sumabs(itr)¶ Sum absolute values of all elements in a collection. This is equivalent to sum(abs(itr)) but faster.
-
sumabs(A, dims) Sum absolute values of elements of an array over the given dimensions.
-
sumabs!(r, A)¶ Sum absolute values of elements of
Aover the singleton dimensions ofr, and write results tor.
-
sumabs2(itr)¶ Sum squared absolute values of all elements in a collection. This is equivalent to sum(abs2(itr)) but faster.
-
sumabs2(A, dims) Sum squared absolute values of elements of an array over the given dimensions.
-
sumabs2!(r, A)¶ Sum squared absolute values of elements of
Aover the singleton dimensions ofr, and write results tor.
-
prod(itr)¶ Returns the product of all elements of a collection.
-
prod(A, dims) Multiply elements of an array over the given dimensions.
-
prod!(r, A)¶ Multiply elements of
Aover the singleton dimensions ofr, and write results tor.
-
any(itr) → Bool¶ Test whether any elements of a boolean collection are true.
-
any(A, dims) Test whether any values along the given dimensions of an array are true.
-
any!(r, A)¶ Test whether any values in
Aalong the singleton dimensions ofrare true, and write results tor.
-
all(itr) → Bool¶ Test whether all elements of a boolean collection are true.
-
all(A, dims) Test whether all values along the given dimensions of an array are true.
-
all!(r, A)¶ Test whether all values in
Aalong the singleton dimensions ofrare true, and write results tor.
-
count(p, itr) → Integer¶ Count the number of elements in
itrfor which predicatepreturns true.
-
any(p, itr) → Bool Determine whether predicate
preturns true for any elements ofitr.
-
all(p, itr) → Bool Determine whether predicate
preturns true for all elements ofitr.julia> all(i->(4<=i<=6), [4,5,6]) true
-
map(f, c...) → collection¶ Transform collection
cby applyingfto each element. For multiple collection arguments, applyfelementwise.julia> map((x) -> x * 2, [1, 2, 3]) 3-element Array{Int64,1}: 2 4 6 julia> map(+, [1, 2, 3], [10, 20, 30]) 3-element Array{Int64,1}: 11 22 33
-
map!(function, destination, collection...) Like
map(), but stores the result indestinationrather than a new collection.destinationmust be at least as large as the first collection.
-
mapreduce(f, op, v0, itr)¶ Apply function
fto each element initr, and then reduce the result using the binary functionop.v0must be a neutral element foropthat will be returned for empty collections. It is unspecified whetherv0is used for non-empty collections.mapreduceis functionally equivalent to callingreduce(op, v0, map(f, itr)), but will in general execute faster since no intermediate collection needs to be created. See documentation forreduceandmap.julia> mapreduce(x->x^2, +, [1:3]) # == 1 + 4 + 9 14
The associativity of the reduction is implementation-dependent. Use
mapfoldl()ormapfoldr()instead for guaranteed left or right associativity.
-
mapreduce(f, op, itr) Like
mapreduce(f, op, v0, itr). In general, this cannot be used with empty collections (seereduce(op, itr)).
-
mapfoldl(f, op, v0, itr)¶ Like
mapreduce, but with guaranteed left associativity.v0will be used exactly once.
-
mapfoldl(f, op, itr) Like
mapfoldl(f, op, v0, itr), but using the first element ofitrasv0. In general, this cannot be used with empty collections (seereduce(op, itr)).
-
mapfoldr(f, op, v0, itr)¶ Like
mapreduce, but with guaranteed right associativity.v0will be used exactly once.
-
mapfoldr(f, op, itr) Like
mapfoldr(f, op, v0, itr), but using the first element ofitrasv0. In general, this cannot be used with empty collections (seereduce(op, itr)).
-
first(coll)¶ Get the first element of an iterable collection.
-
last(coll)¶ Get the last element of an ordered collection, if it can be computed in O(1) time. This is accomplished by calling
endofto get the last index.
-
step(r)¶ Get the step size of a
Rangeobject.
-
collect(collection)¶ Return an array of all items in a collection. For associative collections, returns (key, value) tuples.
-
collect(element_type, collection) Return an array of type
Array{element_type,1}of all items in a collection.
-
issubset(a, b)¶ -
⊆(A, S) → Bool¶ -
⊈(A, S) → Bool¶ -
⊊(A, S) → Bool¶ Determine whether every element of
ais also inb, using theinfunction.
-
filter(function, collection)¶ Return a copy of
collection, removing elements for whichfunctionis false. For associative collections, the function is passed two arguments (key and value).
-
filter!(function, collection)¶ Update
collection, removing elements for whichfunctionis false. For associative collections, the function is passed two arguments (key and value).
Indexable Collections¶
-
getindex(collection, key...)¶ Retrieve the value(s) stored at the given key or index within a collection. The syntax
a[i,j,...]is converted by the compiler togetindex(a, i, j, ...).
-
setindex!(collection, value, key...)¶ Store the given value at the given key or index within a collection. The syntax
a[i,j,...] = xis converted by the compiler tosetindex!(a, x, i, j, ...).
Fully implemented by: Array, DArray, BitArray, AbstractArray, SubArray, ObjectIdDict, Dict, WeakKeyDict, String.
Partially implemented by: Range, UnitRange, Tuple.
Associative Collections¶
Dict is the standard associative collection. Its implementation uses the hash(x) as the hashing function for the key, and isequal(x,y) to determine equality. Define these two functions for custom types to override how they are stored in a hash table.
ObjectIdDict is a special hash table where the keys are always object identities. WeakKeyDict is a hash table implementation where the keys are weak references to objects, and thus may be garbage collected even when referenced in a hash table.
Dicts can be created using a literal syntax: {"A"=>1, "B"=>2}. Use of curly brackets will create a Dict of type Dict{Any,Any}. Use of square brackets will attempt to infer type information from the keys and values (i.e. ["A"=>1, "B"=>2] creates a Dict{ASCIIString, Int64}). To explicitly specify types use the syntax: (KeyType=>ValueType)[...]. For example, (ASCIIString=>Int32)["A"=>1, "B"=>2].
As with arrays, Dicts may be created with comprehensions. For example,
{i => f(i) for i = 1:10}.
Given a dictionary D, the syntax D[x] returns the value of key x (if it exists) or throws an error, and D[x] = y stores the key-value pair x => y in D (replacing any existing value for the key x). Multiple arguments to D[...] are converted to tuples; for example, the syntax D[x,y] is equivalent to D[(x,y)], i.e. it refers to the value keyed by the tuple (x,y).
-
Dict()¶ Dict{K,V}()constructs a hashtable with keys of type K and values of type V. The literal syntax is
{"A"=>1, "B"=>2}for aDict{Any,Any}, or["A"=>1, "B"=>2]for aDictof inferred type.
-
haskey(collection, key) → Bool¶ Determine whether a collection has a mapping for a given key.
-
get(collection, key, default)¶ Return the value stored for the given key, or the given default value if no mapping for the key is present.
-
get(f::Function, collection, key) Return the value stored for the given key, or if no mapping for the key is present, return
f(). Useget!to also store the default value in the dictionary.This is intended to be called using
doblock syntax:get(dict, key) do # default value calculated here time() end
-
get!(collection, key, default)¶ Return the value stored for the given key, or if no mapping for the key is present, store
key => default, and returndefault.
-
get!(f::Function, collection, key) Return the value stored for the given key, or if no mapping for the key is present, store
key => f(), and returnf().This is intended to be called using
doblock syntax:get!(dict, key) do # default value calculated here time() end
-
getkey(collection, key, default)¶ Return the key matching argument
keyif one exists incollection, otherwise returndefault.
-
delete!(collection, key)¶ Delete the mapping for the given key in a collection, and return the colection.
-
pop!(collection, key[, default])¶ Delete and return the mapping for
keyif it exists incollection, otherwise returndefault, or throw an error if default is not specified.
-
keys(collection)¶ Return an iterator over all keys in a collection.
collect(keys(d))returns an array of keys.
-
values(collection)¶ Return an iterator over all values in a collection.
collect(values(d))returns an array of values.
-
merge(collection, others...)¶ Construct a merged collection from the given collections.
-
merge!(collection, others...)¶ Update collection with pairs from the other collections
-
sizehint(s, n)¶ Suggest that collection
sreserve capacity for at leastnelements. This can improve performance.
Fully implemented by: ObjectIdDict, Dict, WeakKeyDict.
Partially implemented by: IntSet, Set, EnvHash, Array, BitArray.
Set-Like Collections¶
-
Set([itr])¶ Construct a
Setof the values generated by the given iterable object, or an empty set. Should be used instead ofIntSetfor sparse integer sets, or for sets of arbitrary objects.
-
IntSet([itr])¶ Construct a sorted set of the integers generated by the given iterable object, or an empty set. Implemented as a bit string, and therefore designed for dense integer sets. Only non-negative integers can be stored. If the set will be sparse (for example holding a single very large integer), use
Setinstead.
-
union!(s, iterable)¶ Union each element of
iterableinto setsin-place.
-
intersect(s1, s2...)¶ -
∩(s1, s2)¶ Construct the intersection of two or more sets. Maintains order and multiplicity of the first argument for arrays and ranges.
-
setdiff(s1, s2)¶ Construct the set of elements in
s1but nots2. Maintains order with arrays. Note that both arguments must be collections, and both will be iterated over. In particular,setdiff(set,element)whereelementis a potential member ofset, will not work in general.
-
setdiff!(s, iterable)¶ Remove each element of
iterablefrom setsin-place.
-
symdiff(s1, s2...)¶ Construct the symmetric difference of elements in the passed in sets or arrays. Maintains order with arrays.
-
symdiff!(s, n)¶ IntSet s is destructively modified to toggle the inclusion of integer
n.
-
symdiff!(s, itr) For each element in
itr, destructively toggle its inclusion in sets.
-
symdiff!(s1, s2) Construct the symmetric difference of IntSets
s1ands2, storing the result ins1.
-
complement(s)¶ Returns the set-complement of IntSet
s.
-
complement!(s)¶ Mutates IntSet
sinto its set-complement.
-
intersect!(s1, s2)¶ Intersects IntSets
s1ands2and overwrites the sets1with the result. If needed, s1 will be expanded to the size ofs2.
-
issubset(A, S) → Bool -
⊆(A, S) → Bool True if A is a subset of or equal to S.
Fully implemented by: IntSet, Set.
Partially implemented by: Array.
Dequeues¶
-
push!(collection, items...) → collection¶ Insert items at the end of a collection.
-
pop!(collection) → item Remove the last item in a collection and return it.
-
unshift!(collection, items...) → collection¶ Insert items at the beginning of a collection.
-
shift!(collection) → item¶ Remove the first item in a collection.
-
insert!(collection, index, item)¶ Insert an item at the given index.
-
deleteat!(collection, index)¶ Remove the item at the given index, and return the modified collection. Subsequent items are shifted to fill the resulting gap.
-
deleteat!(collection, itr) Remove the items at the indices given by
itr, and return the modified collection. Subsequent items are shifted to fill the resulting gap.itrmust be sorted and unique.
-
splice!(collection, index[, replacement]) → item¶ Remove the item at the given index, and return the removed item. Subsequent items are shifted down to fill the resulting gap. If specified, replacement values from an ordered collection will be spliced in place of the removed item.
To insert
replacementbefore an indexnwithout removing any items, usesplice!(collection, n:n-1, replacement).
-
splice!(collection, range[, replacement]) → items Remove items in the specified index range, and return a collection containing the removed items. Subsequent items are shifted down to fill the resulting gap. If specified, replacement values from an ordered collection will be spliced in place of the removed items.
To insert
replacementbefore an indexnwithout removing any items, usesplice!(collection, n:n-1, replacement).
-
resize!(collection, n) → collection¶ Resize collection to contain
nelements.
-
append!(collection, items) → collection.¶ Add the elements of
itemsto the end of a collection.julia> append!([1],[2,3]) 3-element Array{Int64,1}: 1 2 3
-
prepend!(collection, items) → collection¶ Insert the elements of
itemsto the beginning of a collection.julia> prepend!([3],[1,2]) 3-element Array{Int64,1}: 1 2 3
Fully implemented by: Vector (aka 1-d Array), BitVector (aka 1-d BitArray).
PriorityQueue¶
The PriorityQueue type is available from the Collections module. It provides
a basic priority queue implementation allowing for arbitrary key and priority types.
Multiple identical keys are not permitted, but the priority of existing keys can be
changed efficiently.
-
PriorityQueue{K,V}([ord])¶ Construct a new PriorityQueue, with keys of type
Kand values/priorites of typeV. If an order is not given, the priority queue is min-ordered using the default comparison forV.
-
enqueue!(pq, k, v)¶ Insert the a key
kinto a priority queuepqwith priorityv.
-
dequeue!(pq)¶ Remove and return the lowest priority key from a priority queue.
-
peek(pq)¶ Return the lowest priority key from a priority queue without removing that key from the queue.
PriorityQueue also behaves similarly to a Dict so that keys can be
inserted and priorities accessed or changed using indexing notation:
# Julia code
pq = Collections.PriorityQueue()
# Insert keys with associated priorities
pq["a"] = 10
pq["b"] = 5
pq["c"] = 15
# Change the priority of an existing key
pq["a"] = 0
Heap Functions¶
Along with the PriorityQueue type, the Collections module provides
lower level functions for performing binary heap operations on arrays. Each
function takes an optional ordering argument. If not given, default ordering
is used, so that elements popped from the heap are given in ascending order.
-
heapify(v[, ord])¶ Return a new vector in binary heap order, optionally using the given ordering.
-
heapify!(v[, ord])¶ In-place heapify.
-
isheap(v[, ord])¶ Return true iff an array is heap-ordered according to the given order.
-
heappush!(v, x[, ord])¶ Given a binary heap-ordered array, push a new element
x, preserving the heap property. For efficiency, this function does not check that the array is indeed heap-ordered.
-
heappop!(v[, ord])¶ Given a binary heap-ordered array, remove and return the lowest ordered element. For efficiency, this function does not check that the array is indeed heap-ordered.