Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python itertools.combinations: how to obtain the indices of the combined numbers

Tags:

The result created by Python's itertools.combinations() is the combinations of numbers. For example:

a = [7, 5, 5, 4] b = list(itertools.combinations(a, 2))  # b = [(7, 5), (7, 5), (7, 4), (5, 5), (5, 4), (5, 4)] 

But I would like to also obtain the indices of the combinations such as:

index = [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)] 

How can I do it?

like image 475
Randy Tang Avatar asked Nov 26 '14 13:11

Randy Tang


People also ask

What does Itertools combinations return?

What does itertools. combinations() do ? It returns r length subsequences of elements from the input iterable.

How does Itertools combinations work?

itertools.combinations(iterable, r)This tool returns the length subsequences of elements from the input iterable. Combinations are emitted in lexicographic sorted order. So, if the input iterable is sorted, the combination tuples will be produced in sorted order.

How do you find the combination without Itertools?

Using recursion. To create combinations without using itertools, iterate the list one by one and fix the first element of the list and make combinations with the remaining list. Similarly, iterate with all the list elements one by one by recursion of the remaining list.


2 Answers

You can use enumerate:

>>> a = [7, 5, 5, 4] >>> list(itertools.combinations(enumerate(a), 2)) [((0, 7), (1, 5)), ((0, 7), (2, 5)), ((0, 7), (3, 4)), ((1, 5), (2, 5)), ((1, 5), (3, 4)), ((2, 5), (3, 4))] >>> b = list((i,j) for ((i,_),(j,_)) in itertools.combinations(enumerate(a), 2)) >>> b [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)] 
like image 172
fredtantini Avatar answered Nov 14 '22 19:11

fredtantini


You can use range to get order of indexes that combinations produce.

>>> list(itertools.combinations(range(3), 2)) [(0, 1), (0, 2), (1, 2)] 

So you can use len(a):

>>> list(itertools.combinations(range(len(a)), 2)) [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)] 
like image 20
Ardalan Hosseini Avatar answered Nov 14 '22 18:11

Ardalan Hosseini