Найти разные комбинации из двух списков

#python #list

#python #Список

Вопрос:

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

Например, два списка являются:

List1 ['A', 'B']

List2 [1, 2]

Результирующий список должен содержать значения:

 [{'A':1, 'B':1}, {'A':1,'B':2}, {'A':2, 'B':1}, {'A':2, 'B':2}]
  

Все решения, которые я нашел, просто указывали возможные комбинации. Итак, предположим, у меня есть список длиной 3 и 2. Возможные комбинации будут иметь только 6 значений. Но, согласно моему требованию, должно быть 8 значений.

Код, который я использовал:

 first_list = ['A', 'B', 'C'] 
second_list = [1, 2]
 
combinations = [(a,b) for a in first_list for b in second_list]
  

Для которого вывод выглядит как:

 [('A', 1), ('A', 2), ('B', 1), ('B', 2), ('C', 1), ('C', 2)]
  

В то время как результат, который я хочу, является:

 [{'A':1, 'B':1, 'C':1},
 {'A':1, 'B':1, 'C':2},
 {'A':1, 'B':2, 'C':1},
 {'A':1, 'B':2, 'C':2},
 {'A':2, 'B':1, 'C':1},
 {'A':2, 'B':1, 'C':2},
 {'A':2, 'B':2, 'C':1},
 {'A':2, 'B':2, 'C':2}]
  

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

1. Пожалуйста, обновите свой вопрос кодом, который вы пробовали.

2. Это не столько комбинации, сколько элементы декартова произведения. Таким образом, вы могли бы использовать itertools.product . Также — неясно требование, которое привело бы к 8, а не к 6 «комбинациям». Пожалуйста, уточните. Почему бы не использовать пример с предполагаемым результатом для 3 и 2?

3. Вы отредактировали его, но ваше неопределенное требование, которое приводит к предполагаемому выводу 8 элементов в (3,2) случае, а не 6, все еще неясно. Каков фактический предполагаемый результат для вашего примера?

4. Я также отредактировал требуемый вывод.

Ответ №1:

Вы можете использовать itertools.product для создания части комбинаций:

 from itertools import product

first_list = ['A', 'B', 'C'] 
second_list = [1, 2]

out = product(second_list, repeat=len(first_list))

combinations = [{f:s for (f,s) in zip(first_list, c)} for c in out]

print(combinations)
  

Выводите по мере необходимости.

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

1. Я также преобразовываю вторую часть для понимания вложенного списка.

2. Хорошо, спасибо. Я также внесу эти изменения. (Да, en (..) была опечатка).

Ответ №2:

Вы должны посмотреть здесь

Вы можете использовать

 list1 = ["a", "b", "c"]
list2 = [1, 2]
all_combinations = []

list1_permutations = itertools.permutations(list1, len(list2))
Get all permutations of `list1` with length 2

for each_permutation in list1_permutations:
    zipped = zip(each_permutation, list2)
    all_combinations.append(list(zipped))

print(all_combinations)
  

Вывод

 [[('a', 1), ('b', 2)], [('a', 1), ('c', 2)], [('b', 1), ('a', 2)], [('b', 1), ('c', 2)], [('c', 1), ('a', 2)], [('c', 1), ('b', 2)]]