Pythonic方式生成长度为n的元组

时间:2015-09-29 16:23:33

标签: python

给定最小和最大数字,我想获得一个长度为n的元组,每个元素在最小值和最大值之间。例如,如果min是10并且max是20并且如果n是2,我想获得[(10,10),(10,11),...,(19,19)]。我只对数字组合感兴趣,所以如果我已经(18,19),我就不需要(19,18)。

我可以使用长度为2的元组来解决这个问题,但我不太确定如何将其扩展为长度为> tuples的元组。 2.我认为一种方法是将每个数字转换为字符串,然后在其上调用iterations.combinations函数,然后将其转换回整数。但这似乎不必要地复杂,并且想知道是否有更多的pythonic方式来做它?

fangs = [(s, e) for s in range(min_fang, max_fang) for e in range(min_fang, max_fang) if e >= s]

2 个答案:

答案 0 :(得分:3)

您在这里寻找combinations with replacement

from itertools import combinations_with_replacement

fangs = list(combinations_with_replacement(range(min, max), n))

带有替换部分的意味着允许范围中的值在输出中的多个位置使用,因此(10, 10)是有效输出。

演示:

>>> from itertools import combinations_with_replacement
>>> min, max, n = 10, 20, 2
>>> for combo in combinations_with_replacement(range(min, max), n):
...     print(combo)
... 
(10, 10)
(10, 11)
(10, 12)
(10, 13)
(10, 14)
(10, 15)
(10, 16)
(10, 17)
(10, 18)
(10, 19)
(11, 11)
(11, 12)
(11, 13)
(11, 14)
(11, 15)
(11, 16)
(11, 17)
(11, 18)
(11, 19)
(12, 12)
(12, 13)
(12, 14)
(12, 15)
(12, 16)
(12, 17)
(12, 18)
(12, 19)
(13, 13)
(13, 14)
(13, 15)
(13, 16)
(13, 17)
(13, 18)
(13, 19)
(14, 14)
(14, 15)
(14, 16)
(14, 17)
(14, 18)
(14, 19)
(15, 15)
(15, 16)
(15, 17)
(15, 18)
(15, 19)
(16, 16)
(16, 17)
(16, 18)
(16, 19)
(17, 17)
(17, 18)
(17, 19)
(18, 18)
(18, 19)
(19, 19)

答案 1 :(得分:0)

您正在寻找combinations_with_replacement

from itertools import combinations_with_replacement
list(combinations_with_replacement(range(min_fang, max_fang), n))