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-比我认为的旧答案好一些,如果仍然感兴趣-另一个答案应该更快(当然,如果与您相关):)