V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
rickyleegee
V2EX  ›  Python

用 Python 计算 xml 表达式的值

  •  
  •   rickyleegee · 2019-10-13 20:52:45 +08:00 · 2453 次点击
    这是一个创建于 1867 天前的主题,其中的信息可能已经有所发展或是发生改变。
    <expression>
    <plus>
        <int value="5"/>
        <int value="10"/>
        <times>
            <int value="3"/>
            <minus>
                <int value="4"/>
                <plus>
                  <int value="-1000"/>
    	          <int value="999"/>                   
                </plus>
            </minus>
        </times>
    </plus>
    
    </expression>

    这是一个 xml 的文件 读作 5+10+(3*(4-(-1000+999))) 请问要怎么样才能在 python 里面引用这个 xml 文件来计算最终的答案呢?

    5 条回复    2019-10-15 18:15:51 +08:00
    Nagase
        1
    Nagase  
       2019-10-13 22:23:53 +08:00
    int value 算关键字吧,吧后面的放数组里
    necomancer
        2
    necomancer  
       2019-10-14 01:37:58 +08:00   ❤️ 1
    calc = {'plus' : lambda x, y: x+y, 'minus':lambda x,y:x-y, 'times':lambda x,y: x*y}
    data = [5, 10, "plus",3, 4, -1000,999, "plus", "minus", "times","plus"]
    def eval_rp(lst):
    .... stack = []
    ....for item in lst:
    ....if item not in ["plus", "minus", "times"]:
    ........ stack.append(item)
    .... else:
    ........b, a = stack.pop(), stack.pop()
    ........res = calc[item](a, b)
    ........stack.append(res)
    ....return stack[0]

    算符顺序为 xml 关闭节的顺序。注意(+ 1 2 3 4..) 这样的情况就好。
    rickyleegee
        3
    rickyleegee  
    OP
       2019-10-14 14:35:47 +08:00
    @necomancer 谢谢你的方法 但如果不使用 data = []的方式 能不能是直接调用 xml 文件来计算的呢?
    necomancer
        4
    necomancer  
       2019-10-14 15:00:14 +08:00
    @rickyleegee 我很久没用过 xml 那个解析器了,你可以看看 python 读 xml 的那个库。读进来 xml 然后根据节的关系算就行,或者把节转换成逆波兰表示法。
    准确说应该读成:
    data = [5, 10, 3, 4, -1000,999, "plus", "minus", "times","plus", "plus"]
    算符顺序是 xml 节关闭的顺序,但如果某节内多过两个子节,那么算符需要每两个子节重复一次,所以最后多一个 plus
    zzz686970
        5
    zzz686970  
       2019-10-15 18:15:51 +08:00
    `````
    import xml.etree.ElementTree as ET

    test = """
    <expression>
    <plus>
    <int value="5"/>
    <int value="10"/>
    <times>
    <int value="3"/>
    <minus>
    <int value="4"/>
    <plus>
    <int value="-1000"/>
    <int value="999"/>
    </plus>
    </minus>
    </times>
    </plus>
    </expression>
    """
    data = []
    keys = ['minus','plus','times']
    xmlTree = ET.fromstring(test)
    for ele in xmlTree.iter():
    if ele.tag in keys:
    data.append(ele.tag)
    elif 'value' in ele.attrib:
    data.append(int(ele.attrib.get('value')))

    # data = ['plus', 5, 10, 'times', 3, 'minus', 4, 'plus', -1000, 999]
    calc = {'plus': lambda x, y: x+y, 'minus': lambda x, y: x-y, 'times': lambda x, y: x * y}
    def calc_data(lst):
    stack = []
    for item in lst:
    if item not in calc:
    stack.append(item)
    else:
    while len(stack) > 1:
    a, b = stack.pop(), stack.pop()

    res = calc[item](a, b)
    stack.append(res)

    return stack[0]
    print(calc_data(data[::-1]))
    ```````

    在楼上的基础上测试了一下,感谢 @necomancer
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2774 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:34 · PVG 21:34 · LAX 05:34 · JFK 08:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.