#python-3.x #combinations #permutation #itertools
#python-3.x #комбинации #перестановка #python-itertools
Вопрос:
Пример кода
from itertools import *
from collections import Counter
from tqdm import *
#for i in tqdm(Iterable):
for i in combinations_with_replacement(['1','2','3','4','5','6','7','8'], 8):
b = (''.join(i))
if b == '72637721':
print (b)
когда я пытаюсь profuct, у меня есть
for i in product(['1','2','3','4','5','7','6','8'], 8):
TypeError: 'int' object is not iterable
Как я могу получить все комбинации? (я был уверен, что это раньше не тестировалось, так что теперь все, что я делал неправильно)
я читал о том, что combinations_with_replacement возвращает все, но, как я вижу, это ложь
я использую python 3.8
Out put для запроса
11111111 11111112 11111113 11111114 11111115 11111116 11111117
11111118 11111122 11111123 11111124 11111125 11111126 11111127
11111128 11111133 11111134 11111135 11111136 11111137 11111138
11111144 11111145 11111146 11111147 11111148 11111155 11111156
11111157 11111158 11111166 11111167 11111168 11111177 11111178
11111188 11111222 11111223 11111224 11111225 11111226 11111227
11111228 11111233 11111234 11111235 11111236 11111237 11111238
11111244 11111245 11111246 11111247 11111248 11111255 11111256
11111257 11111258 11111266 11111267 11111268 11111277 11111278
11111288
что это начало дает в конце
56666888 56668888 56688888 56888888 58888888 77777777 77777776
77777778 77777766 77777768 77777788 77777666 77777668 77777688
77777888 77776666 77776668 77776688 77776888 77778888 77766666
77766668 77766688 77766888 77768888 77788888 77666666 77666668
77666688 77666888 77668888 77688888 77888888 76666666 76666668
76666688 76666888 76668888 76688888 76888888 78888888 66666666
66666668 66666688 66666888 66668888 66688888 66888888 68888888
88888888
более понятно, как это считать от 1111 1111 до 8888 8888 (но для символов, поэтому я использую try do it при перестановке / объединении с повторениями… в нем отсутствуют некоторые возможные комбинации этих символов.
в качестве примера того, что я пытаюсь сделать, сделайте все перестановки возможных вариантов шестнадцатеричных чисел, например, от 0 до F , но сделайте это не только для них, сделайте это возможным для любого символа.
это только в примере [‘1′,’2′,’3′,’4′,’5′,’6′,’7′,’8’] это может быть [‘a’, ‘b’, ‘x’, ‘c’,’d’, ‘g’, ‘r’, ‘8’] и т.д.
Комментарии:
1. каков ваш ввод и желаемый результат?
2. Ввод в качестве примера 1 2 3 4 5 6 7 8 мне нужно получить всю комбинацию от 11111111 до 88888888 другой пример от 1111 1111 до FFFF FFFF ожидайте все варианты, такие как 111ffad7 или 123fabcd скрипт, который я публикую, говорит сам, что он пытается сделать с помощью этой щеки, если b == ‘72637721’:
3. Можете ли вы включить входные и ожидаемые выходные данные для меньшего примера? Указывает ли 8 длину строки?
4. Не могли бы вы использовать раздел вопросов, чтобы добавить свои данные: ввод, желаемый результат. Что означает от 11111111 до 88888888. Это просто повторение этих чисел для длины списка?
5. я не могу вывести весь вывод, потому что он слишком огромен:/ Но небольшой пример вывода я добавляю. как вы это видите, по какой-то причине некоторые варианты отсутствуют :/
Ответ №1:
решение заключается в использовании itertools.product вместо combinations_with_replacement
from itertools import *
for i in product(['1','2','3','4','5','6','7','8'],repeat = 8):
b = (''.join(i))
if b == '72637721':
print (b)
:
itertools.product ('ABCD', 'ABCD') AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD # full multiplication with duplicates and mirrored pairs
itertools.permutations ('ABCD', 2) -> AB AC AD BA BC BD CA CB CD DA DB DC # full multiplication without duplicates and mirrored pairs
itertools.combinations_with_replacement ('ABCD', 2) -> AA AB AC AD BB BC BD CC CD DD # no mirror pairs with duplicates
itertools.combinations ('ABCD', 2) -> AB AC AD BC BD CD # no mirrored pairs and no duplicates
Ответ №2:
Вот обновленный код, который выведет вам все комбинации. Не имеет значения, есть ли в вашем списке строки и числа.
Чтобы убедиться, что вы выполняете комбинацию только для определенного количества элементов, я рекомендую вам сделать:
comb_list = [1, 2, 3, 'a']
comb_len = len(comb_list)
и замените строку на:
comb = combinations_with_replacement(comb_list, comb_len)
from itertools import combinations_with_replacement
comb = combinations_with_replacement([1, 2, 3, 'a'], 4)
for i in list(comb):
print (''.join([str(j) for j in i]))
Это приведет к следующему:
1111
1112
1113
111a
1122
1123
112a
1133
113a
11aa
1222
1223
122a
1233
123a
12aa
1333
133a
13aa
1aaa
2222
2223
222a
2233
223a
22aa
2333
233a
23aa
2aaa
3333
333a
33aa
3aaa
aaaa
Я не знаю, что вы пытаетесь сделать. Вот попытка начать диалог, чтобы перейти к окончательному ответу:
samples = [1,2,3,4,5,'a','b']
len_samples = len(samples)
for elem in samples:
print (str(elem)*len_samples)
Результат этого будет следующим:
1111111
2222222
3333333
4444444
5555555
aaaaaaa
bbbbbbb
Это то, что вы хотите? Если нет, объясните в разделе вашего вопроса, что вы ожидаете в качестве результата.
Комментарии:
1. Мне нужны комбинации всех возможных вариантов в качестве простого примера от 1 до 8, если было только от 1 до 8, но они нужны мне для любых слов. это было наиболее подходящей функцией, но она не выполняла ожидаемого. Хорошо, думаю, если я сделаю это с 0, так что это будет от 00000000 до 88888888
2. Если вы видите на нашем входе при запуске, все хорошо, но при и это дает (см. Обновление при запросе)
3. Теперь я это вижу. Пытаюсь найти лучший способ выполнить итерацию через это и вывести результат
4. Да, и если вы видите результат от запуска, все работает, но при некотором крутом повороте он перестает работать, как ожидалось, по документам, которые работают чаще всего, как если бы это был простой подсчет по числу = 1 (или на c 1)