任何人都可以解释以下实施:
item = dict((i.tag, (type(i.text) == str and i.text.strip() or i.text)) for i in r if i.tag != "tid_item")
我在各种变量中得到的值:
r is something like : <Element 'Rows' at 0x0000000003DA4540>
i.tag : resultNum
i : <Element 'resultNum' at 0x0000000003EA45A0>
i.text : 1
我是python新手,我无法理解如何在字典中使用forloop,因为值也是荒谬的。
感谢您的帮助!
答案 0 :(得分:4)
首先让代码更清晰:
dict( # constructor
(i.tag, # key
(type(i.text) == str and i.text.strip() or i.text) # value
)
for i in r # driver of the generator
if i.tag != "tid_item" # conditional selector
)
这里有什么,不是字典,而是字典的构造函数,使用生成器。运行此命令后,分配给它的变量item
将包含字典
这个构造函数中的for循环是创建所有元素的生成器:它遍历r中的所有元素,如果它满足条件,那么它将创建一个元组(键,值) - &gt;创造一个即时的&#39;元素列表。
&#39;值的布尔选择器&#39;如果我们用不同的方式写它也很简单:
value = i.text.strip() if (type(i.text) == str) else i.text
答案 1 :(得分:1)
首先,让我们分解你的例子:
item_init = ((i.tag, (type(i.text) == str and i.text.strip() or i.text)) for i in r if i.tag != "tid_item")
item = dict(item_init)
现在,如果你看一下python(help(dict)
)中类型dict
的定义,你会看到一个dict对象可以使用iterable
来初始化(key,价值)对。 item_init
变量包含generator并产生可迭代的元组。
接下来,查看表达式(i.tag, (type(i.text) == str and i.text.strip() or i.text))
。您可能无法理解表达式的第二部分,因为它看起来像一个布尔操作,但实际上是一个条件赋值操作,这意味着:
如果
type(i.text)
为str
,则分配i.text.strip()
其他,分配i.text
最后,item_init
对象是2-uples的生成器,其中对于r的每个元素,第一部分是标记,第二部分是文本(如果需要,则剥离)。标签将用作键,文本将用作最终dict对象中的值。