【发布时间】:2016-02-28 18:07:11
【问题描述】:
版本:Python 3.4.3
您好,我正在尝试创建一个脚本,该脚本从 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 个选择的所有组合。
【问题讨论】:
-
您是否需要
[1 Linea de perforación, Sin ennoblecimiento, plegado envolvente]部分,或者它是否足以创建“唯一ID”并列出包含哪些选项。 -
如果选择超过 12 个,您将获得大量组合 - 假设平均每个选择 5 个项目意味着超过 2.4 亿个组合 (
5**12)。这可能就是为什么它需要一点时间...... -
@pzp 理想情况下,我想知道哪些选项实际创建了该唯一 ID。
-
@TimPietzcker 嗯,我没想到会超过 500... 天哪,我浪费了 10 个小时吗?老实说,我想要做的或多或少类似于这种形式:saxoprint.es/shop/flyers 以便根据选择更新价格。我不知道它是如何编程的,所以我试图以某种方式复制它。
-
而不是保存每个可能的组合,它们很多,保存每个组合的特性,当给定某个组合时,根据每个组合的值计算该组合的值,在这种情况下为价格,如果需要任何缺少的项目,则具有与微积分无关的默认值(如果加法为 0,如果为乘法,则为 1,等等)。 And when a new item is selected or unselected recalculate the whole thing.这或多或少是您想要复制的表格的制作方式
标签: python dictionary combinations itertools