cooldood3490
cooldood3490

Reputation: 2498

Python Nested Loop unique pairs

I'm trying to write a nested loop that prints out all possible "unique pairs" of numbers from a certain range. For example, if the range was from 1 to 3 the unique pairs would be:

(1,2) (1,3) (2,3)

If the range was from 1 to 4 the unique pairs would be:

(1,2) (1,3) (1,4) (2,3) (2,4) (3,4)

Here's how I did it for 1 to 3:

for i in range(1,4):
    for j in range(2,4):
        if (i != j & j != (i-1)):
            print (i,j)

which prints out (1, 2), (1, 3),(2, 3). But this is a hack because it doesn't work when I change the range to 1,5. It prints out duplicate pairs such as (1,5) and (5,1).

Upvotes: 2

Views: 8426

Answers (5)

jinhwanlazy
jinhwanlazy

Reputation: 3561

See itertools module.

Maybe what you want is

list(itertools.combinations(range(1,4),2)) == [(1, 2), (1, 3), (2, 3)]

Upvotes: 4

Shashank
Shashank

Reputation: 13869

You can use itertools.combinations:

>>> from itertools import combinations
>>> print list(combinations(range(1,4), 2))
[(1, 2), (1, 3), (2, 3)]

Python 2 Documentation

Python 3 Documentation

Upvotes: 6

Lukas Graf
Lukas Graf

Reputation: 32590

Use itertools.combinations():

>>> import itertools
>>> print list(itertools.combinations(range(1, 5), r=2))
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]

As long as your inputs are unique, there will be no repeated combinations:

itertools.combinations(iterable, r)

Return r length subsequences of elements from the input iterable.

Combinations are emitted in lexicographic sort order. So, if the input iterable is sorted, the combination tuples will be produced in sorted order.

Elements are treated as unique based on their position, not on their value. So if the input elements are unique, there will be no repeat values in each combination.

Upvotes: 10

Amit Kumar Gupta
Amit Kumar Gupta

Reputation: 18567

for i in range(1,4):
    for j in range(i+1,4):  # <-- the key is to make j start at i+1
        print (i,j)

Upvotes: 10

Alexandru Godri
Alexandru Godri

Reputation: 538

You are probably looking for something like this:

n = 4
x = [(i,j) for i in range(1,n+1) for j in range(i+1, n+1)]
print x

Cheers, Alex

Upvotes: 6

Related Questions