Как я могу упростить эту итерацию Python? - PullRequest
5 голосов
/ 25 апреля 2019

Я хочу получить все возможные комбинации из трех (или более) чисел. Сами числа должны быть в диапазоне + -1. Диапазон должен найти «похожие числа» - например, число 3 должно быть повторено как 2,3,4. Например, у меня есть:


    num1 = 3 
    num2 = 4
    num3 = 1

Так что в этом примере я хочу, чтобы все комбинации для этих трех чисел и каждого числа + -1. (Например, 341, 241, 441; 351, 331, ...). Так что для номеров примеров я должен получить 27 комбинаций.

Первая идея состояла в том, чтобы использовать 3 цикла for в python, как это:


    num1 = 3
    num2 = 4
    num3 = 1

    def getSimilar(num1,num2,num3):

        num1 = n1 - 2

        for i in range (3):
            num1 = num1 + 1
            num2 = n2 - 2

            for j in range(3):

                num2 = num2 + 1
                num3 = n3 - 2

                for k in range(3):
                    num3 = num3 + 1
                    print(num1,num2,num3)

Вывод получаю:


    2 3 0
    2 3 1
    2 3 2
    2 4 0
    2 4 1
    2 4 2
    2 5 0
    2 5 1
    2 5 2
    3 3 0
    3 3 1
    3 3 2
    3 4 0
    3 4 1
    3 4 2
    3 5 0
    3 5 1
    3 5 2
    4 3 0
    4 3 1
    4 3 2
    4 4 0
    4 4 1
    4 4 2
    4 5 0
    4 5 1
    4 5 2

Есть ли более умный и быстрый способ сделать это в python вместо использования 3 для циклов? Порядок вывода не имеет значения. Небольшая проблема у меня дополнительно: Если одно число равно 0, мне нужно, чтобы оно повторялось только до 0 и 1, а не до -1. Итак, вывод на 0; 4; 1 должно быть:


    0 4 1
    0 4 2
    0 4 0

    0 3 1
    0 3 2
    0 3 0

    0 5 1
    0 5 2
    0 5 0

    1 4 1
    1 4 2
    1 4 0

    1 3 1
    1 3 2
    1 3 0

    1 5 1
    1 5 2
    1 5 0

Ответы [ 3 ]

5 голосов
/ 25 апреля 2019

Вот решение, которое обрабатывает ваш крайний случай:

from itertools import product

nums = [0, 4, 1]
options = [[x - 1, x, x + 1] for x in nums]
result = [similar for similar in product(*options) if all(x >= 0 for x in similar)]
for x in result:
    print(x)

Вывод:

(0, 3, 0)
(0, 3, 1)
(0, 3, 2)
(0, 4, 0)
(0, 4, 1)
(0, 4, 2)
(0, 5, 0)
(0, 5, 1)
(0, 5, 2)
(1, 3, 0)
(1, 3, 1)
(1, 3, 2)
(1, 4, 0)
(1, 4, 1)
(1, 4, 2)
(1, 5, 0)
(1, 5, 1)
(1, 5, 2)
3 голосов
/ 25 апреля 2019

Вы можете сделать это так:

from itertools import product

def getSimilar(*nums):
    return product(*(range(max(n - 1, 0), n + 2) for n in nums))

num1 = 3
num2 = 4
num3 = 1
for comb in getSimilar(num1, num2, num3):
    print(comb)

# (2, 3, 0)
# (2, 3, 1)
# (2, 3, 2)
# (2, 4, 0)
# ...
1 голос
/ 25 апреля 2019

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

from itertools import product
digits = [3,4,0,-1]

#Generate all possible digits
all_digits = [ (k-1,k,k+1) for k in digits]

#Valid digits, ensuring not to consider negative digits
valid_digits = [digits for digits in all_digits if all(x >= 0 for x in digits)]

#Create the iterator of all possible numbers
nums = product(*valid_digits)

#Print the combinations
for num in nums:
    print(*num)

Вывод будет выглядеть так.

2 3
2 4
2 5
3 3
3 4
3 5
4 3
4 4
4 5
...