Python 使用可变数量的for循环创建元组

Python 使用可变数量的for循环创建元组,python,for-loop,variables,tuples,python-2.x,Python,For Loop,Variables,Tuples,Python 2.x,给定n和k,我需要创建长度k的所有元组,其条目从范围(n)(0到n-1)开始,这样元组的条目按字典顺序排列,并且有特定格式的括号。具体地说,元组从内到外在每一对周围都有括号 例如,如果n=3和k=4,那么我希望输出包括类似((0,0),1),2),但不是类似((0,0),2),1) 下面的代码适用于此特定实例。问题是我不知道如何概括k,这是下面代码中循环的数量。我只能对特定的k执行此操作,如k=4。我真的需要能够对k的任何值执行此操作 n=3 k=4 my_list = [] for a in

给定
n
k
,我需要创建长度
k
的所有元组,其条目从
范围(n)
(0到n-1)开始,这样元组的条目按字典顺序排列,并且有特定格式的括号。具体地说,元组从内到外在每一对周围都有括号

例如,如果
n=3
k=4
,那么我希望输出包括类似
((0,0),1),2)
,但不是类似
((0,0),2),1)

下面的代码适用于此特定实例。问题是我不知道如何概括
k
,这是下面代码中
循环的
数量。我只能对特定的
k
执行此操作,如
k=4
。我真的需要能够对
k
任何值执行此操作

n=3
k=4
my_list = []
for a in range(n):
    x = a
    for b in range(a,n):
        y = (x,b)
        for c in range(b,n):
            z = (y,c)
            for d in range(c,n):
                w = (z,d)
                my_list.append(w)
print my_list
输出:


(0,0,0,0,0,0,0,0,0),0,1,(0,0,0,0),2,(0,0,0,1),1,(1,(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,(1),1,(1,(0,0,0,0,0,0,0,0,0,0,1,1,1,1),2),2,(2),2,(1,(1),2,(1),2,(1),2,(1,(1,(1,(1,(0,1,(0,1,(1,1,1,1),1),1),1,(1),1,(1),1,(1),1,(1,(1,(1),1,(1),1,(1),1,(1),1,(1,(1,(1),1,(1),1,(1),图书馆

乍一看,您的问题看起来像是创建了一个包含所有替换组合的列表(尽管您确实希望使用k+1)。这不会有“嵌套”属性,但它会精确地给出您想要的数字,我想调整结构比按照您的方式提出递归算法要容易得多。下面是一个例子:

import itertools

n = 3
k = 4
choices = range(n)
output = list(itertools.combinations_with_replacement(choices, k + 1)
# output = [(0, 0, 0, 0), (0, 0, 0, 1), ...]

尝试一下,我希望它是相关的:

n=4
k=4
my_list=[(((a,b),c),d) for a in range(n) for b in range(a,n) for c in range(b,n) for d in range(c,n) ]
print my_list
输出

[((0,0,0),0),((0,0,0),1),((0,0,0),2),((0,0,0), 3), (((0, 0), 1), 1), (((0, 0), 1), 2), (((0, 0), 1), 3), (((0, 0), 2), 2), (((0, 0), 2), 3), (((0, 0), 3), 3), (((0, 1), 1), 1), (((0, 1), 1), 2), (((0, 1), 1), 3), (((0, 1), 2), 2), (((0, 1), 2), 3), (((0, 1), 3), 3), (((0, 2), 2), 2), (((0, 2), 2), 3), (((0, 2), 3), 3), (((0, 3), 3), 3), (((1, 1), 1), 1), (((1, 1), 1), 2), (((1, 1), 1), 3), (((1, 1), 2), 2), (((1, 1), 2), 3), (((1, 1), 3), 3), (((1, 2), 2), 2), (((1, 2), 2), 3), (((1, 2), 3), 3), (((1, 3), 3), 3), (((2, 2), 2), 2), (((2, 2), 2), 3), (((2, 2), 3), 3), (((2, 3), 3), 3) ,((3,3,3,3)]


以下几点应该行得通

def tuples(n, k):
    if k == 2:
        return [(i,j) for i in range(n) for j in range(i, n)]
    else:
        return [(t, m) for t in tuples(n, k-1) for m in range(t[1], n)]
基本大小写精确地生成结果中所需的元组


从递归用例生成的每个元组
(x,y)
,我们创建一组元组
((x,y),z)
,其中
z>=y

基于
itertools的另一种解决方案。将\u与\u替换组合在一起

import itertools

n, k = 4, 4
f = lambda x: (f(x[:-1]), x[-1]) if len(x)>2 else x

print(*map(f, itertools.combinations_with_replacement(range(n), k)), sep='\n')
印刷品:

(((0, 0), 0), 0)
(((0, 0), 0), 1)
(((0, 0), 0), 2)
(((0, 0), 0), 3)
(((0, 0), 1), 1)
...and so on.

k
从何而来?这是
for
循环的数量吗?我可以问一下这是为了什么吗?@user1558604:是的,k是for循环的数量。我不知道这是否是模拟这个“算法”的最佳方法但是如果你想改变循环的数量,你可以把它转换成一个递归函数,递归k次……只要k不是太大并且达到最大递归限制,那么你在Python中有一个图,你想删除“冗余”顶点吗?例如
((0,0),1),2)
等于
((0,0),2),1)
?我已经看到了。真正的问题是嵌套括号。这只适用于固定的
k
;对任何
k
都有效的东西的请求很好,尽管您应该通过适当的函数定义更改f。