Skip to content

ernestosuarez/itertools

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

itertools

Itertools is a tool kit to generate combinations and permutations of go slices. It works similar to python itertools.

Installation

go get -u github.com/ernestosuarez/itertools

Usage (Examples)

After installation the package has to be imported.

import "github.com/ernestosuarez/itertools"

###Generating combinations Slices of integers

// combinations of r = 3 elements chosen from iterable
r := 3
iterable := []int{1, 2, 3, 4 }

for v := range CombinationsInt(iterable, r) {
      fmt.Println(v)

output:

[1 2 3]
[1 2 4]
[1 3 4]
[2 3 4]

Slices of strings

// combinations of r = 3 elements chosen from iterable
r := 3
iterable := []string{"A", "B", "C", "D"}

for v := range CombinationsStr(iterable, r) {
      fmt.Println(v)

output:

[A B C]
[A B D]
[A C D]
[B C D]

Custom type List

Notice you have to use the right function depending of the type of the slice. For a more general case the user could define a custom type List as follows:

type List []interface{}

Then can create a list of heterogeneous types and follow the same procedure. In this case CombinationsList has to be used.

r := 3
myList := List{1, "B", 3, 3.14}

for v := range CombinationsList(myList, r) {
      fmt.Println(v)

output:

[1 B 3]
[1 B 3.14]
[1 3 3.14]
[B 3 3.14]

###Generating permutations Slices of integers

If the number (r) of chosen element is equal to the length of the iterable, then we will obtain the r-factorial permutations

// permutations of r = 3 elements chosen from iterable with length 3
r := 3
iterable := []int{1, 2, 3}

for v := range PermutationsInt(iterable, r) {
      fmt.Println(v)

output:

[1 2 3]
[1 3 2]
[2 1 3]
[2 3 1]
[3 1 2]
[3 2 1]

On the other hand we can chose less than len(iterable) elements

// permutations of r = 3 elements chosen from a iterable of length 4
r := 3
iterable := []int{1, 2, 3, 4}

for v := range CombinationsInt(iterable, r) {
      fmt.Println(v)

output:

[1 2 3]
[1 3 2]
[2 1 3]
[2 3 1]
[3 1 2]
[3 2 1]
[1 2 4]
[1 4 2]
[2 1 4]
[2 4 1]
[4 1 2]
[4 2 1]
[1 3 4]
[1 4 3]
[3 1 4]
[3 4 1]
[4 1 3]
[4 3 1]
[2 3 4]
[2 4 3]
[3 2 4]
[3 4 2]
[4 2 3]
[4 3 2]

Slices of strings

Same idea, just use the function PermutationsStr

Custom type List

Same as in combinations, fist define the new type List (see above) and then use PermutationsList

Contributions

Contributions are welcome!

About

Combinations and permutations generator in Go, in a similar way to python itertools.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages