Reputation: 319
For example, if the input list is
[1, 2, 3, 4]
I want the output to be
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
If possible, I would like a solution which is better than the brute force method of using two for loops. How do I implement this?
Upvotes: 31
Views: 30566
Reputation: 4991
import itertools
x = [1,2,3,4]
for each in itertools.permutations(x,2):
print(each)
Note that itertools is a generator object, meaning you need to iterate through it to get all you want. The '2' is optional, but it tells the function what's the number per combination you want.
Edited:
As ForceBru said in the comment, you can unpack the generator to print, skipping the for loop together But I would still iterate through it as you might not know how big the generated object will be:
print(*itertools.permutations(x, 2))
Upvotes: 6
Reputation: 8254
Though the previous answer will give you all pairwise orderings, the example expected result seems to imply that you want all unordered pairs.
This can be done with itertools.combinations
:
>>> import itertools
>>> x = [1,2,3,4]
>>> list(itertools.combinations(x, 2))
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
Compare to the other result:
>>> list(itertools.permutations(x, 2))
[(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]
Upvotes: 52