XML 列表元素将字符串转换为 int

问题描述

我从网上读取了一个 XML 文件,对其进行解码并将其放入一棵树中进行解析:

data = openedurl.read()
xml = data.decode()
tree = ET.fromstring(xml)
counts = tree.findall('.//count')   

我返回以下计数元素:

我检查类型及其列表:

列表中填充了字符串数字。目标是将其从字符串转换为整数。

我知道我能做到:

mylist =[]
for count in counts:
    mylist.append(int(count.text))

我也能做到:

mylist = [int(count.text) for count in counts]

我尝试使用 map 但我没有成功,我得到:

counts = list(map(int,counts))
TypeError: int() argument must be a string,a bytes-like object or a number,not 'xml.etree.ElementTree.Element'

有没有办法使用 map 做到这一点? 我也应该没有为理解创建一个新列表 mylist 而只是这样做:

counts = [int(count.text) for count in counts]

我只是想更好地编写代码并更好地理解什么以及为什么。

谢谢

解决方法

在前两种情况下,您执行 count.text 以获得 text。但是,在使用 map 时,您只需将 int 函数直接应用于 count,而不是 count.text

由于 count 是一个 Element 对象而不是字符串,因此您会收到错误:

TypeError: int() 参数必须是字符串、类似字节的对象或 数字,而不是“xml.etree.ElementTree.Element”

如果您想使用 map 来获取计数列表,您可以像这样在 map 中使用 lambda expression

mylist = list(map(lambda x: int(x.text),counts))

这样,int 函数就应用于 count 内的字符串(在本例中为 x.text)。

关于你的第二个问题

counts = [int(count.text) for count in counts]

对比

mylist = [int(count.text) for count in counts]

这完全是您的选择。如果您以后想重新使用原来的 counts,请不要覆盖它,而是创建一个新的 mylist;否则,覆盖现有的 counts 完全没问题。

,

将找到所有计数元素总和的 PFB 代码:

import urllib.request
import xml.etree.ElementTree as ET

url = 'http://py4e-data.dr-chuck.net/comments_42.xml'
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
data = response.read()
xml = data.decode()
tree = ET.fromstring(xml)

counts = tree.findall('.//count')

count_lst = []
sum = 0
for count in counts:
    count_lst.append(int(count.text))
    sum = sum + int(count.text)

print('count_lst: ',count_lst)
print('sum of all counts: ',sum)

输出:

count_lst:  [97,97,90,88,87,80,79,78,76,72,66,65,64,61,59,58,57,54,51,49,47,40,38,37,36,32,25,24,22,21,19,18,14,12,9,7,3,2]

sum of all counts:  2553

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...