Python 排列组合生成

zckun:老哥们, 请教一个问题, 是关于排列组合的, 前几天和老哥们讨论了一下, 能是能解决, 但感觉不太方便
看一个简单的例子应该就明白了.

<school type="primary|middle|university">
    <class number="1"/>
</school>

to

<school type="primary">
    <class number="1"/>
</school>

<school type="middle">
    <class number="1"/>
</school>

<school type="university">
    <class number="1"/>
</school>

目前是我这样做的, 用了一个模版
template

<school type="{school_type}">
    <class number="{class_number}"/>
</school>

代码和上面的学校例子有点不同,因为我的完整需求是这样的

<!-- base -->
<cross>
    <rule1 hint="rule 1" name="long" val1="30|60" val2="90|120" condition="1">
        <necessary_rule val1="60" val2="120" condition="1"/>
    </rule1>
</cross>

<!-- generator -->
<!-- 1 -->
<cross>
    <rule1 hint="rule 1" name="long" val1="30" val2="90" condition="1">
        <necessary_rule val1="60" val2="120" condition="1"/>
    </rule1>
</cross>

<!-- 2 -->
<cross>
    <rule1 hint="rule 1" name="long" val1="30" val2="120" condition="1">
        <necessary_rule val1="60" val2="120" condition="1"/>
    </rule1>
</cross>

<!-- 3 -->
<cross>
<rule1 hint="rule 1" name="long" val1="60" val2="90" condition="1">
    <necessary_rule val1="60" val2="120" condition="1"/>
</rule1>
</cross>

<!-- 4 -->
<cross>
<rule1 hint="rule 1" name="long" val1="60" val2="120" condition="1">
    <necessary_rule val1="60" val2="120" condition="1"/>
</rule1>
</cross>

代码

import xml.etree.ElementTree as ET
import itertools

from typing import Dict, Optional


def producer(rule, root_tag: Optional[str] = ''):
    rule_tag = rule.tag
    rule_temp = {}
    rule_attrib = rule.attrib
    for k, v in rule_attrib.items():
        k = f'{root_tag}{rule_tag}_{k}'
        if 'val' in v:
            v = rule_attrib.get(v)
        rule_temp[k] = v.split('|')
    return rule_temp


def params_parser():
    tree = ET.parse('rule.xml')
    rule_params = {}
    root = tree.getroot()
    for strategy in root:
        for rule in strategy:
            rule_params.update(**producer(rule))
            for child_rule in rule:
                rule_params.update(**producer(child_rule, root_tag=f'{rule.tag}_'))

    return rule_params


def rule_generator(rule_params: Dict):
    with open('rule_template.xml', encoding='utf-8') as f:
        template = f.read()

    for values in itertools.product(*rule_params.values()):
        params = dict(zip(rule_params.keys(), values))
        data = template.format(**params)
        print(data)


def main():
    rule_params = params_parser()
    rule_generator(rule_params)


if __name__ == '__main__':
    main()

我的思路是取出所有 tag 的 attrib,然后替换到模版.
上面的做法能解决我的问题,但这样每次都要弄一个模版我觉得很麻烦,有没有更简洁的办法

Python 对于配置进行排列组合

zckun:在造轮子之前问下有没有老哥知道这种或者类似的对于 xml 或其他配置的排列组合的库,谢谢 <a val="1|2"> <b val="3|4"/> </a> <!-- --> <a val="1"> <b val="3"/> </a> <a val="1"&…

Python Pandas导出数据 - python

我正在使用python pandas处理一些数据。我已使用以下代码将数据导出到excel文件。writer = pd.ExcelWriter('Data.xlsx'); wrong_data.to_excel(writer,"Names which are wrong", index = False); writer.…

如何使用BeautifulSoup在<tr>中捕获特定的<td> - python

尝试从nyc Wiki页面中的高中列表中获取所有高中名称。我已经写了足够多的脚本,可以让我获取包含在高中,学业和入学条件列表的表的<tr>标记中的所有信息-但是我如何才能缩小到我认为的范围内在td[0]内休息(会弹出KeyError)-只是学校的名称?到目前为止我写的代码:from bs4 import BeautifulSoup from ur…

Python 3运算符>>打印到文件 - python

我有以下Python代码编写项目的依赖文件。它可以在Python 2.x上正常工作,但是在使用Python 3进行测试时会报告错误。depend = None if not nmake: depend = open(".depend", "a") dependmak = open(".depend.mak&#…

Python:对于长时间运行的进程,通过还是休眠? - python

我正在编写一个队列处理应用程序,该应用程序使用线程等待和响应要发送到该应用程序的队列消息。对于应用程序的主要部分,只需要保持活动状态即可。对于像这样的代码示例:而True: 通过要么而True: time.sleep(1)哪一个对系统的影响最小?除了保持python应用运行外,什么都不做的首选方式是什么? 参考方案 我可以想象time.sleep()会减少系…