如何在字典中使用循环

时间:2017-04-10 14:39:07

标签: python dictionary

任何人都可以解释以下实施:

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,因为值也是荒谬的。

感谢您的帮助!

2 个答案:

答案 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对象中的值。