如何在字典中使用for循环

3

请问有人可以解释下面的实现吗:

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新手,不理解如何在字典中使用for循环,因为值也很奇怪。

谢谢帮助!


请查看Python中的列表推导式。一个有用的链接是http://www.secnetix.de/olli/Python/list_comprehensions.hawk - undefined
@NikosVitaTopiko 这里有点误导,没有使用列表推导式。 - undefined
同样的原则,参见PEP 289 - 生成器表达式。我投票关闭此问题,因为它过于广泛,但也可以标记为什么是“列表推导”以及如何使用它或一些等效的生成器表达式的重复问题。 - undefined
2个回答

5

让我们先把代码变得更清晰:

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中的所有元素,如果满足条件,则会创建一个元组(key,value)->创建一个即时列表的元素。
对于'value'的布尔选择器也很简单,如果我们以不同的方式编写它:
value = i.text.strip() if (type(i.text) == str) else i.text

2
首先,让我们分解你的例子:
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中dict类型的定义(help(dict)),您将看到可以使用(键,值)对的iterable初始化dict对象。 item_init变量包含一个生成器并产生元组的可迭代对象。
接下来,看一下表达式(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元组,其中对于r的每个元素,第一部分是标签,第二部分是文本(如果需要,则已剥离)。标签将用作键,文本将用作最终字典对象中的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接