Как я могу создать список всех возможных комбинаций между элементами другого списка?

#python #python-3.x

Вопрос:

допустим , у нас есть список, состоящий из целого числа от 0 до другого числа, большего 0 :

 list = [0,1,2,3...and so on]  

Я хотел бы получить набор или даже список, содержащий список для всех пар возможных комбинаций между элементами начального списка. как это:

 new_list = [[0,1],[0,2],[0,3],[1,0],[1,2],[1,3],[2,0],[2,1],[2,3],[3,0],[3,1],[3,2]]  

Как вы можете видеть, пары [0,0],[1,1],[2,2],[3,3] не должно быть включено.

Я пробовал несколько вещей, но в итоге ничего не вышло . Знаете ли вы эффективный способ сделать это?

Ответ №1:

Использование itertools.combinations и их отмена:

 from itertools import combinations  combos = list(combinations(lst, 2))  new_list = [*combos, *(c[::-1] for c in combos)]  

Или вручную:

 def pairings(pool):  for i, m in enumerate(pool):  for n in pool[i 1:]:  yield (m, n)  # yield (n, m) # saves second loop if order does not matter  for i, m in enumerate(pool):  for n in pool[i 1:]:  yield (n, m)  new_list = list(pairings(lst))  

Комментарии:

1. Можно ли это сделать без импорта? может быть, с пониманием списка?

Ответ №2:

Вы можете использовать простое понимание списка:

 [[a, b] for a in lst for b in list if a != b]  

Ответ №3:

Как насчет простого понимания вложенного цикла или генератора?

 def comb_not_eq_loop(seq, container=list):  return container(x, y) for x in seq for y in seq if x != y)   comb_not_eq_loop(list(range(3)) # [(0, 1), (0, 2), (1, 2), (1, 0), (2, 0), (2, 1)]  
 def comb_not_eq_gen(seq):  for x in seq:  for y in seq:  if x != y:  yield (x, y)   list(comb_not_eq_gen(list(range(3))) # [(0, 1), (0, 2), (1, 2), (1, 0), (2, 0), (2, 1)]