问题描述
我从网上读取了一个 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