Python Itertools в двух списках. Получить более 1 значение из каждого списка - PullRequest
1 голос
/ 30 марта 2020

У меня есть код ниже. Этот код дает все возможные комбинации между list1 и list2.

import itertools
list1 = [1,2,3,4,5]
list2 = [6,7,8,9,10]
print(list(itertools.product(list1, list2)))

Output:
[(1, 6), (1, 7), (1, 8), (1, 9), (1, 10), (2, 6), (2, 7), (2, 8), (2, 9), (2, 10), (3, 6), (3, 7), (3, 8), (3, 9), (3, 10), (4, 6), (4, 7), (4, 8), (4, 9), (4, 10), (5, 6), (5, 7), (5, 8), (5, 9), (5, 10)]

Я хочу получить все возможные комбинации по 2 значениям из списка 1 и 3 значениям из списка 2 (без дубликатов). Так что возможный вывод следует как ниже. Как я могу это сделать?

[(1,2,6,7,8), (1,2,7,8,9), (1,2,8,9,10), (2,3,6,7,8), and so on.......]

Ответы [ 2 ]

4 голосов
/ 30 марта 2020

Будет делать следующее:

from itertools import combinations as com, product as prod

list1 = [1, 2, 3, 4, 5]
list2 = [6, 7, 8, 9, 10]

[c1 + c2 for c1, c2 in prod(com(list1, 2), com(list2, 3))]

# [(1, 2, 6, 7, 8), 
#  (1, 2, 6, 7, 9), 
#  (1, 2, 6, 7, 10),
#  ...
#  (4, 5, 7, 9, 10), 
#  (4, 5, 8, 9, 10)]

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

0 голосов
/ 30 марта 2020

Вам нужно сначала создать комбинации, которые вам нужны для каждого списка, затем создать продукт, вам также нужно присоединиться к внутреннему результату продукта ((1, 2), (6, 7, 8)) => (1, 2, 6, 7, 8)

list1 = [1, 2, 3, 4, 5]
list2 = [6, 7, 8, 9, 10]

c1 = combinations(list1, r=2)
c2 = combinations(list2, r=3)

print(list(map(lambda x: tuple(chain(*x)), product(c1, c2)))) # [(1, 2, 6, 7, 8), (1, 2, 6, 7, 9), (1, 2, 6, 7, 10), (1, 2, 6, 8, 9), (1, 2, 6, 8, 10), (1, 2, 6, 9, 10), (1, 2, 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...