permutations of two lists in python

后端 未结 5 1035
甜味超标
甜味超标 2020-12-02 12:57

I have two lists like:

list1 = [\'square\',\'circle\',\'triangle\']
list2 = [\'red\',\'green\']

How can I create all permutations of these

相关标签:
5条回答
  • 2020-12-02 13:38
    >>> import itertools
    >>> map(''.join, itertools.chain(itertools.product(list1, list2), itertools.product(list2, list1)))
    ['squarered', 'squaregreen', 'circlered',
    'circlegreen', 'trianglered', 'trianglegreen',
    'redsquare', 'redcircle', 'redtriangle', 'greensquare',
    'greencircle', 'greentriangle']
    
    0 讨论(0)
  • 2020-12-02 13:39

    You can in any case do something like:

    perms = []
    for shape in list1:
      for color in list2:
        perms.append(shape+color)
    
    0 讨论(0)
  • 2020-12-02 13:49

    I think what you are looking for is the product of two lists, not the permutations:

    #!/usr/bin/env python
    import itertools
    list1=['square','circle','triangle'] 
    list2=['red','green']
    for shape,color in itertools.product(list1,list2):
        print(shape+color)
    

    yields

    squarered
    squaregreen
    circlered
    circlegreen
    trianglered
    trianglegreen
    

    If you'd like both squarered and redsquare, then you could do something like this:

    for pair in itertools.product(list1,list2):
        for a,b in itertools.permutations(pair,2):
            print(a+b)
    

    or, to make it into a list:

    l=[a+b for pair in itertools.product(list1,list2)
       for a,b in itertools.permutations(pair,2)]
    print(l)
    

    yields

    ['squarered', 'redsquare', 'squaregreen', 'greensquare', 'circlered', 'redcircle', 'circlegreen', 'greencircle', 'trianglered', 'redtriangle', 'trianglegreen', 'greentriangle']
    
    0 讨论(0)
  • 2020-12-02 13:53

    You want the itertools.product method, which will give you the Cartesian product of both lists.

    >>> import itertools
    >>> a = ['foo', 'bar', 'baz']
    >>> b = ['x', 'y', 'z', 'w']
    
    >>> for r in itertools.product(a, b): print r[0] + r[1]
    foox
    fooy
    fooz
    foow
    barx
    bary
    barz
    barw
    bazx
    bazy
    bazz
    bazw
    

    Your example asks for the bidirectional product (that is, you want 'xfoo' as well as 'foox'). To get that, just do another product and chain the results:

    >>> for r in itertools.chain(itertools.product(a, b), itertools.product(b, a)):
    ...   print r[0] + r[1]
    
    0 讨论(0)
  • 2020-12-02 14:00

    How about

    [x + y for x in list1 for y in list2] + [y + x for x in list1 for y in list2]
    

    Example IPython interaction:

    In [3]: list1 = ['square', 'circle', 'triangle']
    
    In [4]: list2 = ['red', 'green']
    
    In [5]: [x + y for x in list1 for y in list2] + [y + x for x in list1 for y in list2]
    Out[5]: 
    ['squarered',
     'squaregreen',
     'circlered',
     'circlegreen',
     'trianglered',
     'trianglegreen',
     'redsquare',
     'greensquare',
     'redcircle',
     'greencircle',
     'redtriangle',
     'greentriangle']
    
    0 讨论(0)
提交回复
热议问题