如何在Python中生成非递减整数n元组?
考虑元组如何在Python中生成非递减整数n元组?,python,Python,考虑元组(x_1,x_2,…,x_n),每个元组都满足1的要求,您可以尝试以下方法: def list_of_tuples(n, m): return set(tuple(sorted(tup)) for tup in product(range(1,m+1), repeat = n)) 对于n=3和m=2,其结果为: {(1, 2, 2), (2, 2, 2), (1, 1, 1), (1, 1, 2)} 虽然这不是很有效,但也许这并不重要。您可以尝试以下方法: def list_of_
(x_1,x_2,…,x_n)
,每个元组都满足1的要求,您可以尝试以下方法:
def list_of_tuples(n, m):
return set(tuple(sorted(tup)) for tup in product(range(1,m+1), repeat = n))
对于n=3和m=2,其结果为:
{(1, 2, 2), (2, 2, 2), (1, 1, 1), (1, 1, 2)}
虽然这不是很有效,但也许这并不重要。您可以尝试以下方法:
def list_of_tuples(n, m):
return set(tuple(sorted(tup)) for tup in product(range(1,m+1), repeat = n))
对于n=3和m=2,其结果为:
{(1, 2, 2), (2, 2, 2), (1, 1, 1), (1, 1, 2)}
虽然这不是很有效,但也许这并不重要。我不确定我是否得到了您想要的东西,但也许这个代码片段可以工作:
list_of_tuples = list(product(range(1,m+1), repeat = n))
my_set = set([tuple(sorted(t)) for t in list_of_tuples])
使用set
操作,您可以保留每个副本的一个副本,这样您就完成了。不确定我是否得到了您想要的内容,但这个代码片段可能会起作用:
list_of_tuples = list(product(range(1,m+1), repeat = n))
my_set = set([tuple(sorted(t)) for t in list_of_tuples])
使用set
操作,您可以保留每个副本的一个副本,这样就完成了。此代码可以通过递归非常轻松地完成,而无需使用itertools
def non_decreasing(n, m):
if n==0:
return []
if n==1:
return [[i] for i in range(1,m+1)]
return [[i] + t for t in non_decreasing(n-1, m) for i in range(1,t[0]+1)]
例如:
In [23]: non_decreasing(2,3)
Out[23]: [[1, 1], [1, 2], [2, 2], [1, 3], [2, 3], [3, 3]]
这段代码可以很容易地通过递归完成,而不需要使用itertools
def non_decreasing(n, m):
if n==0:
return []
if n==1:
return [[i] for i in range(1,m+1)]
return [[i] + t for t in non_decreasing(n-1, m) for i in range(1,t[0]+1)]
例如:
In [23]: non_decreasing(2,3)
Out[23]: [[1, 1], [1, 2], [2, 2], [1, 3], [2, 3], [3, 3]]
该工作是否:
from itertools import combinations_with_replacement as cwr
for tup in cwr(range(1, m+1), n):
do_whatever_with(tup)
该工作是否:
from itertools import combinations_with_replacement as cwr
for tup in cwr(range(1, m+1), n):
do_whatever_with(tup)
您是否考虑过使用内置的sorted
函数对元组列表进行排序?您可以使用sorted
函数对列表中的元组进行排序。你的问题不清楚,所以我不能再帮你了。你能提供一个所需输入和输出的例子吗?你需要所有的非递减元组吗?@Joel我做了一个编辑。现在清楚了吗?请尝试排序(元组列表,key=lambda x:(x[0],x[1],x[2])
您是否正在寻找具有替换(范围(1,m+1),n)的组合?(我不是在回答这个问题,因为我认为这可能是个骗局,如果是的话。)您是否考虑过使用内置的sorted
函数对元组列表进行排序?您可以使用sorted
函数对列表中的元组进行排序。你的问题不清楚,所以我不能再帮你了。你能提供一个所需输入和输出的例子吗?你需要所有的非递减元组吗?@Joel我做了一个编辑。现在清楚了吗?请尝试排序(元组列表,key=lambda x:(x[0],x[1],x[2])您是否正在寻找具有替换(范围(1,m+1),n)的组合?(我不是在回答这个问题,因为我认为这可能是一个重复,如果是的话。)实际上,我的目标是测试元组的元素之和是否等于它们的乘积,m=2n。对于n的各种值,我必须生成每个元素范围为1到2n的非递减元组,然后我要对它们进行迭代,检查元组的元素之和是否等于它们的乘积。实际上,我的目标是测试元组元素的和是否等于它们的乘积,m=2n。对于n的各种值,我必须生成每个元素范围为1到2n的非递减元组,然后我要对它们进行迭代,检查元组的元素之和是否等于它们的乘积。我想如果效率高的话会更好。嗨,谢谢你的回答。这种方法有多有效?我想对$n的大值进行此操作。$您认为使用此方法可行吗?@SuperMario:这将比过滤itertools.product
输出更可行,但无论您如何生成这些元组,迭代所有元组都可能是不可行的。嗨,谢谢您的回答。这种方法有多有效?对于$n的大值,我想这样做。$你认为使用这种方法可行吗?@SuperMario:这将比过滤itertools.product
输出更可行,但不管你如何生成它们,迭代所有这些元组都可能是不可行的。