Madhushani Hewagama
Madhushani Hewagama

Reputation: 468

Python find all the different choices from list of list

I want to get all the different choices from a list of lists in python. for example, take a list like,

list=[[a,b,c],[a,d,e]]

I just want to select choices from one at each list and get all the possible different selections. so above list possible choices look like,

    [a,a]
    [a,d]
    [a,e]
    [b,a]
    [b,d]
    [b,e]
    [c,a]
    [c,d]
    [c,e]

without using any external library, how can I do this?

Upvotes: 1

Views: 847

Answers (5)

Hasibul Islam Polok
Hasibul Islam Polok

Reputation: 105

l=[['a','b','c'],['a','d','e']]
def combinations(L, tmp=None):
    if tmp is None:
        tmp = []
    if L==[]:
        print (tmp)
    else:
        for i in L[0]:
            product(L[1:], tmp+[i])
combinations(l)

Does this help?

Upvotes: 1

Blaine
Blaine

Reputation: 677

you could use generators,

perm = [(i,j) for i in list[0] for j in list[1]]

furthermore if you could convert this into a generator object, if you memory concerns,

perm = ((i,j) for i in list[0] for j in list[1]])

I was told you have n lists and want to permutate all of them, you can use a while loop

while(len(list)>1):
    a = list.pop()
    b = list.pop()
    list.append([(i, j) for i in a for j in b])

or make a recursive function. Do note, that the answer will be list[0] and not list itself.

Upvotes: 1

Amit Berger
Amit Berger

Reputation: 509

The most pythonic way is with itertools you can simply use product from the itertools library like so:

my_list = [[a,b,c],[a,d,e]]
# will contain: [(a,a), (a,d)...]
all_combinations = list(itertools.product(*my_list))

The "*" unpacks the list into the lists it contains, its like writing:

# will contain: [(a,a), (a,d)...]
list(itertools.product([a,b,c],[a,d,e]))

It is worth mentioning that this works for any number of sublists.

my_list = [[a,b,c],[a,d,e], [1,2,3]]

# will contain: [(a,a,1), (a,a,2)...]
all_combinations = list(itertools.product(*my_list))

Hope that helps

Upvotes: 1

alani
alani

Reputation: 13079

Easiest to implement with a recursive generator.

def yield_combos(lst):
    if lst:
        for el in lst[0]:
            for combo in yield_combos(lst[1:]):
                yield [el] + combo
    else:
        yield []


lst = [['a','b','c'], ['a','d','e']]
for combo in yield_combos(lst):
    print(combo)

If you prefer the output as a list, you can always convert it into one:

print(list(yield_combos(lst)))

Minor notes:

  • I've called the variable lst where the question uses list; it's not a good idea to override a builtin, and in this case doing so would prevent the call to list from working.

  • I've set some string values in the caller for sake of a self-contained program (the question had a in place of 'a', etc).

Upvotes: 3

gph
gph

Reputation: 1359

The simplest way to do this is with two functions

def funcA(x, arr):
  return [(x,c) for c in arr]

def funcB(arr1, arr2):
  ans = []
  for x in arr1:
    ans.extend(funcA(x, arr2))
  return ans

Call it whichever way to need:

funcB(your_list[0], your_list[1])

Upvotes: 1

Related Questions