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?
What does itertools. combinations() do ? It returns r length subsequences of elements from the input iterable.
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.
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.
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)]
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)]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With