3

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

minver = (1,2,3)
maxver = (1,2,9)

是否有一种简单而优雅的方法可以将“范围”从minvertomaxver作为 a list?即对于上述情况,我想得到list这样的:

[(1,2,3), (1,2,4), (1,2,5), (1,2,6), (1,2,7), (1,2,8), (1,2,9)]

(注意:如果列表中缺少最后一个元素也可以,即如果返回的范围不包括最大值。)

range函数显然不起作用(期望整数),但我也不想依赖元组恰好是元素(在上述情况下为xx = )。3

例如,如果我有 a它minver tuple (1,)应该被视为包含三个值/元素(例如)。(1,0,0)maxver tuple(1,2,3)

以pythonic方式执行此操作的任何方式(很优雅)?

4

2 回答 2

7

好的 - 现在是凌晨 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)
于 2013-07-08T01:34:57.840 回答
1

为了平衡,这里是凌晨 3:00 :)

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

我已经为 python 3 编写了这段代码,但它可以很容易地用于 python 2.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 个中最好的:每个循环101微秒

使用increase

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

1000000 个循环,3 个中最好的:每个循环0.606微秒

于 2013-07-08T21:14:34.523 回答