2016-02-28 50 views
2

版本:的Python 3.4.3在Python值的所有可能的組合

嗨,我想創建一個腳本讀取一些選擇項目的菱選擇在一個HTML文件,並創建一個數據庫所有可能的選擇都基於它們的值爲其分配唯一的ID。

這是HTML的結構:

   <select id="perforar" onchange="Actualiza(this.id, this.options[this.selectedIndex].value)"> 
       <option value="g1">sin perforacion</option> 
       <option value="g2">1 Linea de perforación</option> 
       <option value="g3">2 Lineas de perforación</option> 
       <option value="g4">3 Lineas de perforación</option> 
       <option value="g5">4 Lineas de perforación</option> 
       <option value="g6">5 Lineas de perforación</option> 
       <option value="g7">6 Lineas de perforación</option> 
      </select></td> 
      </tr><tr><td>Ennoblecimiento: </td><td> 
      <select id="ennoblecimiento" onchange="Actualiza(this.id, this.options[this.selectedIndex].value)"> 
       <option value="h1">sin ennoblecimiento</option> 
       <option value="h2">barniz UV</option> 
       <option value="h3">laminado</option> 
      </select></td> 
      </tr><tr><td>Plegado: </td><td> 
      <select id="plegado" onchange="Actualiza(this.id, this.options[this.selectedIndex].value)"> 
       <option value="i1">plegado envolvente</option> 
       <option value="i2">plegado en acordéon</option> 
       <option value="i3">plegado en ventana</option> 

我手動複製/粘貼所有入.txt,然後運行該代碼:

#load file into buffer 
leyendo = open("generadorbasedatos.txt", 'r') 
archivotxt = leyendo.read() 
leyendo.close() 
#split it for lines 
listadividida = [] 
listadividida= archivotxt.split("\n") 
#create a dict for later 
basededatos = {} 

#for each line 
for i in listadividida: 
    if not "<option" in i: #if isn't an option, delete that line 
     i = "" 
    else: #if it's an option, get the value and the text 
     #the text 
     desde = '>' 
     hasta = '<' 
     _,_,resto = i.partition(desde) 
     opcion,_,_ = resto.partition(hasta) 
     #the value 
     desde = 'value="' 
     hasta = '">' 
     _,_,resto = i.partition(desde) 
     laid,_,_ = resto.partition(hasta) 
     #add them to a dict 
     basededatos[laid] = [opcion, laid] 
     #And this is where I'm lost and I need help 
print(basededatos) 

現在到了麻煩,我想該腳本創建所有可能組合的列表併爲每個組合分配一個ID,以使用這些值創建ID,因此輸出應如下所示:

g1h1i1: [1 Linea de perforación, Sin ennoblecimiento, plegado envolvente] 
g1h1i2: [1 Linea de perforación, Sin ennoblecimiento, plegado en acordeón] 
g1h1i3: [1 Linea de perforación, Sin ennoblecimiento, plegado en ventana] 
g1h2i1: [1 Linea de perforación, barniz, plegado envolvente] 
g1h2i2: [1 Linea de perforación, barniz, plegado plegado en acordeón] 
g1h3i3: [1 Linea de perforación, barniz, plegado en ventana] 

最終所有可能的組合。我嘗試itertools,並設法凍結我的電腦(可能是由於內存不足或無限循環問題),所以現在我在這裏問。

什麼是實現我想要做的最好的方法?

注意:有超過12個選擇,這裏只複製/粘貼3個例子,但代碼應該能夠創建超過3個選擇的所有組合。

+0

你需要的'[1凌特德perforación,仙ennoblecimiento,plegado envolvente]'部分或它足以創建包含哪些選項列表的「唯一ID」。 – pzp

+0

如果有超過12個選擇,你會得到大量的組合 - 假設平均每個選擇5項意味着超過2.4億個組合('5 ** 12')。這可能是爲什麼它需要一段時間... –

+0

@pzp理想情況下,我想知道什麼選項實際上創建該唯一的ID。 – Saelyth

回答

0

從您的角度來看,這實現你的目標:

from itertools import product 
base={'g':[],'h':[],'i':[]} 
for (key,value) in basededatos.items(): base[key[0]].append(value) # to split the fields. 
products=product(*base.values()) #make all combinations 
finaldict={ "".join([p[1] for p in t]) : [p[0] for p in t] for t in products } 
# formatting in a dictionnary. 

某些值:

In [263]: base 
Out[263]: 
{'g': [['1 Linea de perforación', 'g2'], 
    ['4 Lineas de perforación', 'g5'], 
    ['2 Lineas de perforación', 'g3'], 
    ...., 
'h': [['laminado', 'h3'], ['barniz UV', 'h2'], ['sin ennoblecimiento', 'h1']], 
'i': [['plegado en ventana', 'i3'], 
    ['plegado en acordéon', 'i2'], 
    ....]} 


In [265]: finaldict 
Out[265]: 
{'g1h3i2': ['sin perforacion', 'laminado', 'plegado en acordéon'], 
'g7h2i1': ['6 Lineas de perforación', 'barniz UV', 'plegado envolvente'], 
'g2h3i3': ['1 Linea de perforación', 'laminado', 'plegado en ventana'],.... 
+0

當我添加11個基礎值而不是3個(a,b,c,d,e,f,g, H,I,J,K)。可能是因爲組合太多了? – Saelyth

+0

可能。有(a的選擇數量)*(b的選擇數量)* ... *(k個選項的數量)組合。多少 ? –