Я пытаюсь создать программу на Python, которая производит все комбинации числа n-1
с длиной L
:
Я пробовал использовать itertools
, но безуспешно. Я пытаюсь сделать так, чтобы он выдавал результат выше, когда я передаю ему аргументы 5 3
в моем терминале. Я использую python3. Объяснение было бы отличным. Вот мой код.
import sys
import itertools
def comb(A,n,k,p,lo):
stuff = [A, n, k,p,lo]
return itertools.combinations(stuff, len(stuff)
if __name__ == "__main__":
d = len(sys.argv)>3
n = int(sys.argv[1])
k = int(sys.argv[2])
A = []
for i in range(k):
A.append(0)
if d: print("n:",n,"k:",k)
comb(A,n,k,0,0)
где вы печатаете comb(A,n,k,0,0)
Почему у вас в списке для stuff
2 нуля? Почему ты не можешь просто это сделать? combinations(range(n), L)
где n ваш номер
Мое плохое, похоже, что в копии перепутали. Я поправлю.
Что такое «число n-1»? Что такое «число длиной L?».
N-1 - вот как это звучит. Например, 5 произведет все комбинации 0-4. L - длина списка комбинаций.
«Число n-1» звучит для меня чепухой. Я думаю, вы имеете в виду, что n - это первый аргумент командной строки вашей программы, а L - второй аргумент командной строки. Затем ваша задача - создать все комбинации целых чисел L-длины от 0 до n-1 (включительно). Это правильно?
@PaulCornelius Да
print(itertools.combinations(range(int(sys.argv[1])),int(sys.argv[2])))
отредактировано: чтобы указать ввод, как указано
Это дает мне ошибку компиляции. Вот как я пытаюсь это реализовать. В нем говорится, что объект str нельзя использовать как целое число. def comb (A, n, k, p, lo): print (itertools.combinations (диапазон (sys.argv [1]), sys.argv [2]) )
Вам нужно преобразовать аргументы в целые числа - замените sys.argv[1]
на int(sys.argv[1])
и аналогично для argv [2].
Да извини, что набирал трубку и поленился. @ Павел Корнелиус прав
import sys
from itertools import combinations
if __name__ == "__main__":
d = len(sys.argv)>3
n = int(sys.argv[1])
k = int(sys.argv[2])
A = []
for i in range(n):
A.append(i)
if d:
print("n:",n," k:",k)
val = combinations(A, k)
for i in val:
print(i)
Вам не нужна вспомогательная функция, я не думаю
Это должно работать с python 3:
import sys
import itertools
def printArray(inputArray):
print('[', str(inputArray)[1:-1], ']')
def comb(arr, r):
output = itertools.combinations(arr, r)
for x in output:
printArray(x)
if __name__ == "__main__":
arr = range(int(sys.argv[1]))
r = int(sys.argv[2])
comb(arr, r)
Просто используйте: python3 test.py 5 3
вывод:
[ 0, 1, 2 ]
[ 0, 1, 3 ]
[ 0, 1, 4 ]
[ 0, 2, 3 ]
[ 0, 2, 4 ]
[ 0, 3, 4 ]
[ 1, 2, 3 ]
[ 1, 2, 4 ]
[ 1, 3, 4 ]
[ 2, 3, 4 ]
@ J.Doe Поскольку результат комбинаций является итеративным, мы должны пройти его в цикле, чтобы распечатать. Кроме того, для первого аргумента мы не можем просто отправить int (sys.argv [1]), потому что itertools.combinations ожидает отправки итеративного
мой последний вопрос: как бы вы распечатали это как массив вместо строк. В основном, как вы печатаете [] вместо ()?
Я думаю, вы могли бы создать небольшую вспомогательную функцию, а затем для каждого небольшого массива распечатать определенный формат. Я поиграю с ним и обновлю
@ J.Doe для python3 вы можете использовать функцию printArray, которую я добавил
Спасибо. Как убрать белое пространство по бокам?
Без проблем. Что касается белых пространств, вам, вероятно, придется кое-что попробовать. Вы можете начать с этих ресурсов: Распечатать и Аналогичный вопрос
Похоже, ваш отступ немного сбился, и из-за этого трудно понять, что происходит. Какой результат вы получите сейчас?