Search code examples
pythonstringlistfor-loopcartesian-product

How to create lists from a cartesian product of two string lists


I have two string lists that look like this:

print(objects_list)
print(verb_list)

they output:

['parking_meter', 'sink', 'teddy_bear']
 
 ['sail', 'fill', 'fly', 'greet', 'hit', 'hose', 'hunt', 'install',
 'kick', 'launch', 'move', 'pick', 'repair', 'sit_at', 'squeeze',
 'stab', 'straddle', 'talk_on']

I want product of these two lists in a format that looks like this:

[['parking_meter','sail'],['parking_meter','fill'],['parking_meter','fly']......]

I tried this code

list3 = [[str(l),str(n)] for l in objects_list for n in verb_list]
print(list3)

but it outputs:

[['[', '['], ['[', "'"], ['[', 's'], ['[', 'a'], ['[', 'i'], ['[',
 'l'], ['[', "'"], ['[', ','], ['[', ' '], ['[', "'"], ['[', 'f'],
 ['[', 'i'], ['[', 'l'], ['[', 'l'], ['[', "'"], ['[', ','], ['[', '
 '], ['[', "'"], ['[', 'f'], ['[', 'l'], ['[', 'y'], [.....

any solution?


Solution

  • Try this, use the itertools library. There is a function called product that gets you a cartesian product.

    import itertools
    
    x = ['parking_meter', 'sink', 'teddy_bear']
    
    y = ['sail', 'fill', 'fly', 'greet', 'hit', 'hose', 'hunt', 'install', 'kick', 'launch', 'move', 'pick', 'repair', 'sit_at', 'squeeze', 'stab', 'straddle', 'talk_on']
    

    Then you can do this 2-liner, (because the product function returns a tuple but you require a list)

    z = list(itertools.product(x,y))
    z = [list(z) for z in z]
    

    Or this 1-liner,

    z = [list(tup) for tup in list(itertools.product(x, y))]
    

    Then I,

    print (z)
    

    Which gives me

    [['parking_meter', 'sail'],
     ['parking_meter', 'fill'],
     ['parking_meter', 'fly'],
     ['parking_meter', 'greet'],
     ['parking_meter', 'hit'],
     ['parking_meter', 'hose'],
     ['parking_meter', 'hunt'],
     ['parking_meter', 'install'],
     ['parking_meter', 'kick'],
     ['parking_meter', 'launch'],
     ['parking_meter', 'move'],
     ['parking_meter', 'pick'],
     ['parking_meter', 'repair'],
     ['parking_meter', 'sit_at'],
     ['parking_meter', 'squeeze'],
     ['parking_meter', 'stab'],
     ['parking_meter', 'straddle'],
     ['parking_meter', 'talk_on'],
     ['sink', 'sail'],
     ['sink', 'fill'],
     ['sink', 'fly'],......