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。