Python 2.7 两个整数元组之间的范围?

Python 2.7 两个整数元组之间的范围?,python-2.7,range,tuples,Python 2.7,Range,Tuples,元组似乎是版本号比较的理想选择(假设只有数字元素,这在我的例子中是给定的)。我有两个由整数组成的元组形式的版本号。假设这些元组是: minver = (1,2,3) maxver = (1,2,9) 有没有一种简单而优雅的方法可以将minver到maxver的“范围”作为列表来获取?也就是说,对于上述情况,我希望得到如下列表: [(1,2,3), (1,2,4), (1,2,5), (1,2,6), (1,2,7), (1,2,8), (1,2,9)] (注意:如果列表中缺少最后一个元素,即

元组似乎是版本号比较的理想选择(假设只有数字元素,这在我的例子中是给定的)。我有两个由整数组成的元组形式的版本号。假设这些元组是:

minver = (1,2,3)
maxver = (1,2,9)
有没有一种简单而优雅的方法可以将
minver
maxver
的“范围”作为
列表来获取?也就是说,对于上述情况,我希望得到如下
列表:

[(1,2,3), (1,2,4), (1,2,5), (1,2,6), (1,2,7), (1,2,8), (1,2,9)]
(注意:如果列表中缺少最后一个元素,即返回的范围不包括最大值,也可以。)

range
函数显然不起作用(需要整数),但我也不想依赖元组就是
x
元素(在上述情况下,x=
3

例如,如果我有一个
minver
元组
(1,)
如果
maxver
元组
包含三个值/元素(例如
(1,2,3)
),则应将其视为
(1,0,0)


有没有办法用pythonic的方式(很优雅)?

好的-现在是凌晨2:30,所以原则是你确定任何版本的最大长度和上限,然后将其作为数字的基数。。。将开始和结束转换为int以用作范围,然后使用另一个函数将其转换回元组。。。将需要一些工作,但相当可靠的理论

from itertools import izip_longest, chain

minver = (1, 1, 3)
maxver = (1, 3, 19)

def version_range(start, end):
    start, end = zip(*izip_longest(start, end, fillvalue=0))
    base = max(max(chain(start, end)), 9) + 1
    def _toint(seq, base):
        return sum(base ** n * val for n, val in enumerate(reversed(seq)))
    def _totuple(num, base, length):
        ret = []
        for n in (base ** i for i in reversed(range(length))):
            res, num = divmod(num, n)
            ret.append(res)
        return tuple(ret)
    for se in xrange(_toint(start, base), _toint(end, base) + 1):
        print _totuple(se, base, len(start))


version_range(minver, maxver)

为了使事情公平,现在是凌晨3点:)

我认为在没有电源
***
操作的情况下实现这一点是可能的,这对于大数字来说可能会很昂贵

我已经为Python3编写了这段代码,但它很容易被Python2.7采用

原则是生成新版本,直到达到最大版本

代码如下:

# Easier to work with lists (for me)
min_ver = [1,1,2]
max_ver = [2,3,4]

max_num = max(min_ver + max_ver)
orig_length = len(min_ver)


def increase(an_array, max_num):
    while an_array[-1] == max_num:
        an_array.pop()
    an_array[-1] += 1
    an_array += [0] * (orig_length - len(an_array))
    return an_array


def gen_range(start, end, max_num):
    while start != end:
        yield increase(start, max_num)


for version in gen_range(min_ver, max_ver, max_num):
    print(version)
一些比较:

使用
**

C:\Work>python -mtimeit -s"import tuples2" "tuples2.version_range((1,1,1),(1,3,5));"
10000个循环,最好是3个:101usec每个循环

使用
增加

C:\Work>python -mtimeit -s"import tuples" "tuples.gen_range([1,1,1], [1,3,5], 5)"

1000000个循环,最好是3个:0.606usec/循环

,因此编辑回避了一个问题:
(1,2)
(1,3,1)
(例如)@JonClements:aaaaah。。。现在我明白你的意思了……:)。。。说得很好,我都没想到。让我们假设已知它的最大值,现在假设它是
9
。我想,你的回答让我开始了。正在修补。我也只是在修补;)好的-另一个答案不限于0-9-比我认为的旧答案好一些,如果仍然感兴趣-另一个答案应该更快(当然,如果与您相关):)