#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)]]