我有一个元组,让我们说(2,5,8)。
a = (2,5,8)
元组的每个元素都可以采用一系列值。例如,第一个位置的范围可以是0到4,第二个位置的范围是0到6,第三个位置的范围是0到10.我想要做的是保持固定位置2和3并列出包含第一个位置的所有组合没有(2,5,8)的元素。然后,对位置2和3重复相同的操作,并将其添加到列表输出中。
我想要的输出类似于:
[ (0,5,8), (1,5,8), (3,5,8), (4,5,8),
(2,1,8), (2,2,8), (2,3,8), (2,4,8), (2,6,8), .. ]
非常感谢有关如何有效完成此任务的任何建议!
提前致谢!
编辑:此元组表示系统的状态。我想写下一个函数,它将元组作为输入,并输出一个列表,其中包含系统可以转换到的所有可能状态。棘手的部分是过渡的动态,我在上面描述过。
答案 0 :(得分:1)
高效的是什么意思?如果你的处理能力是指它,你应该使用3个循环将你想要的东西附加到列表中。
result = []
for i in range(5):
result.append((i, 5, 8))
for i in range(7):
result.append((2, i, 8))
for i in range(9):
result.append((2, 5, i))
或者如果您使用python3或更高版本的python2:
result = [(i, 5, 8) for i in range(5)] + [(2, i, 8) for i in range(7)] + [(2, 5, i) for i in range(9)]
请记住,最后,您的列表中需要5 + 8 + 9 = 22个项目,因此您无法以更简单的循环方式编写任何计算效果。
编辑:有关更通用的解决方案:
base = (2, 5, 8)
bounds = ((0, 4), (0, 7), (0, 9))
result = []
for i in range(len(base)):
result.extend((base[:i] + (j,) + base[i+1:] for j in range(bounds[i][0], bounds[i][1]+1)))
答案 1 :(得分:0)
尽管@Ariestinak给出了一个很好的解决方案,但这里有一个你可以使用的通用函数:
def getCombinations( a, b, c ):
result = [(i, b, c) for i in range(5)] + \
[(a, i, c) for i in range(7)] + \
[(a, b, i) for i in range(9)]
return result
然后使用它,你所要做的就是:
a = (2,5,8)
getCombinations(*a)