如何简化此python迭代?

use*_*097 5 python iteration python-3.x

我想获得三个(或更多)数字的所有可能组合。数字本身必须在+ -1的范围内。范围是查找“相似数字”-例如,数字3需要迭代为2,3,4。例如,我有:


    num1 = 3 
    num2 = 4
    num3 = 1

Run Code Online (Sandbox Code Playgroud)

因此,在此示例中,我希望这三个数字以及每个数字+ -1的所有组合。(例如341、241、441; 351、331 ...)。因此,对于示例数字,我应该获得27种组合。

第一个想法是在python中使用3个for循环,如下所示:


    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)

Run Code Online (Sandbox Code Playgroud)

我得到的输出:


    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

Run Code Online (Sandbox Code Playgroud)

有没有一种更聪明,更快速的方式在python中执行此操作,而不是使用3 for循环?输出的顺序无关紧要。我还有一个小问题:如果一个数字为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

Run Code Online (Sandbox Code Playgroud)

Err*_*rse 5

这是处理边缘情况的解决方案:

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)
Run Code Online (Sandbox Code Playgroud)

输出:

(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)
Run Code Online (Sandbox Code Playgroud)


jde*_*esa 3

你可以这样做:

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)
# ...
Run Code Online (Sandbox Code Playgroud)