2013-07-07 19 views
2

元組似乎理想的版本號進行比較(假設僅數字元素,這是在我的情況下給定的)。我有兩個以整數組成的元組形式的版本號。說那些元組是:兩個整數元組之間的範圍?

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

有一個簡單而優雅的方式來獲得minver的「範圍」,以maxverlist?即針對上述情況,我想獲得一個list這樣的:

[(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)。

例如,如果我有一個minvertuple(1,)應該像(1,0,0)進行處理,如果maxvertuple包含3個值/元件(如(1,2,3))。

在Python的方式(即優雅)這樣的方法嗎?

+0

所以編輯提出了問題:'(1,2)'和'(1,3,1)'之間的範圍是什麼(例如) –

+1

@JonClements:aaaah ...現在我明白了你的意思...... :)非常好的一點,甚至沒有想到這一點。我們假設已知最大值,現在假設它是'9'。你的回答讓我開始了,我認爲*。修補此刻。 – 0xC0000022L

+1

我只是調整;) –

回答

6

好了 - 這是凌晨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) 
1

爲了讓事情,這是凌晨3點這裏: )

我認爲這是可能實現這種無動力**操作,這可能會爲大數字昂貴。

我寫的Python 3這個代碼,但它可以爲蟒蛇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)" 

百萬循環,最好的3:0。606每個迴路的用途