0

I try the code below, is there a efficent way to do this?

c = []
l = [['A1','A2'], ['B1','B2'],  ['C1','C2'] ]

for i in range(0, len(l) - 1):
    for j in range(i+1, len(l)): 
        c.append(sorted([l[i][0],l[i][1],l[j][0]]))
        c.append(sorted([l[i][0],l[i][1],l[j][1]]))
        c.append(sorted([l[i][0],l[j][0],l[j][1]]))
        c.append(sorted([l[i][1],l[j][0],l[j][1]]))

print(c)

Out put:

[['A1', 'A2', 'B1'], ['A1', 'A2', 'B2'], ['A1', 'B1', 'B2'],
['A2', 'B1', 'B2'], ['A1', 'A2', 'C1'], ['A1', 'A2', 'C2'], 
['A1', 'C1', 'C2'], ['A2', 'C1', 'C2'], ['B1', 'B2', 'C1'], 
['B1', 'B2', 'C2'], ['B1', 'C1', 'C2'], ['B2', 'C1', 'C2']
Nurjan
  • 5,889
  • 5
  • 34
  • 54
Tom
  • 83
  • 1
  • 7

2 Answers2

2

Try this:

# group every 2 lists in list l
ll = list(itertools.combinations(l, 2))

# generate all combinations of 3 elements out from each 2 lists
c = [list(itertools.combinations(a + b, 3)) for (a, b) in ll]

# concate all elements
c = sum(c, [])
Pan Long
  • 1,024
  • 1
  • 9
  • 16
  • Also you need to `list(map(list, c))` to have `list` of `list` objects as OP's output. – vishes_shell Oct 18 '16 at 07:36
  • Since the OP asks about efficiency, `c = sum(c, [])` is probably not ideal (`O(n^2)`). A nested comprehension is more performant: `c = [x for l in c for x in l]`. (http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python) – user2390182 Oct 18 '16 at 07:42
1

Or in one line

from itertools import product

c = [[k] + i for i, j in product(l, l) if j!=i for k in j]  
Sardorbek Imomaliev
  • 14,861
  • 2
  • 51
  • 63