在Python中列出任务

时间:2016-07-13 01:06:26

标签: python list tuples

我有一个元组,让我们说(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), .. ]

非常感谢有关如何有效完成此任务的任何建议!

提前致谢!

编辑:此元组表示系统的状态。我想写下一个函数,它将元组作为输入,并输出一个列表,其中包含系统可以转换到的所有可能状态。棘手的部分是过渡的动态,我在上面描述过。

2 个答案:

答案 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)