как получить список возможных пар в списке списков — python

#python

#python

Вопрос:

У меня есть следующий список списков

 a = [[1,2,3],[4,5,6,7]]
  

пытаюсь получить следующий результат

 b = [[1,2],[1,3],[2,3],[4,5],[4,6],[4,7],[5,6],[5,7],[6,7]]
  

Я пытался использовать

 b = list(itertools.product(a))
  

но я получил комбинацию первого со вторым. Ценю любую помощь, спасибо

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

1. Я думаю, что это дает список кортежей, а не список списков

2. b = list(itertools.product(*a)) выдает комбинацию первого списка со вторым

Ответ №1:

Если вы ищете решение с использованием стандартной библиотеки, для вызова этого списка используется понимание списка itertools.combinations для каждого подсписка.

 from itertools import combinations
b = [list(c) for l in a for c in combinations(l, r=2)]
b
# [[1, 2], [1, 3], [2, 3], [4, 5], [4, 6], [4, 7], [5, 6], [5, 7], [6, 7]]
  

Другой очень функциональный способ вычисления этого — использование map ; это возвращает список кортежей.

 from itertools import chain, combinations
from functools import partial

fn = partial(combinations, r=2)
b = list(chain.from_iterable(map(fn, a))) 
b 
# [(1, 2), (1, 3), (2, 3), (4, 5), (4, 6), (4, 7), (5, 6), (5, 7), (6, 7)]
  

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

1. вы можете использовать itertools.chain, чтобы избежать вложенного понимания

2. @coldspeed Я думал о чем-то подобном этому: list(chain(*(combinations(l, r=2) for l in a))) просто чтобы избежать вложенного понимания. Единое понимание достаточно читаемо, IMO

3. @Tryph Я думаю, что это еще один вариант, хотя обычно мне не нравится смешивать функциональное программирование и синтаксис понимания.