我想获得三个(或更多)数字的所有可能组合。数字本身必须在+ -1的范围内。范围是查找“相似数字”-例如,数字3需要迭代为2,3,4。 例如,我有:
num1 = 3
num2 = 4
num3 = 1
因此,在此示例中,我希望这三个数字以及每个数字+ -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)
我得到的输出:
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 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
答案 0 :(得分:5)
以下是处理边缘情况的解决方案:
pytest
输出:
pytest
答案 1 :(得分: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)
# ...
答案 2 :(得分:1)
首先通过列表理解来创建有效数字列表,然后使用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