Python中sorted+lambda排序XML节点的疑问及按volume排序问题
问题解答
1. 你提到的lambda表达式作用
lambda child: (child.tag,child.get('volume'))是给sorted()提供复合排序键,逻辑分两层:
- 第一层:先按XML节点的标签名(比如示例里的
sale)分组排序,确保同类型的节点归为一组。 - 第二层:在同一标签的节点组内,按节点的
volume属性值排序——注意这里是节点的属性(比如<sale volume="xxx">这种写法里的属性),不是你示例里的volume子节点,这也是你之前单独用child.get('volume')按子节点排不了的核心原因:child.get()是读取节点的属性,不是子节点的内容。
2. 按sale元素的volume子节点排序的方法
要按volume子节点排序,得先定位到sale节点下的volume子节点,读取它的文本内容,还要转成整数(不然字符串排序会出问题,比如"10"会被排在"2"前面)。修改后的代码如下:
import xml.etree.ElementTree as ET tree = ET.parse("warehouse.xml") root = tree.getroot() # 按volume子节点的数值排序 root[:] = sorted(root, key=lambda child: int(child.find('volume').text) if child.find('volume') is not None else 0)
补充说明:
child.find('volume'):在当前sale节点下找到第一个名为volume的子节点。.text:获取该子节点的文本内容(比如示例里的"10")。- 转成
int()是为了按数值大小排序,避免字符串字典序的错误排序。 - 后面的
if...else是为了处理没有volume子节点的情况,给默认值0,防止代码报错。
内容的提问来源于stack exchange,提问作者Tunaz
相关产品推荐
相关产品推荐

