2013-06-01 171 views
3

我不明白为什么这两个语句不相等。python dict列表for for循环

for item in tree.findAll('item'): 
    names = [{ 
     'id': item.id.string, 
     'title': __decodefunction(item.entitle.string) 
    }] 

它有1项 但如果这些声明

names = [{ 
    'id': item.id.string, 
    'title': __decodefunction(item.entitle.string) 
}for item in tree.findAll('item')] 

它有6个项目。

我想使用第一个循环,但它不显示正确数量的项目。正确的输出是6项。

回答

9

他们做了非常不同的事情。

第一个在循环的每次迭代中定义新的names值,替换以前的任何值。每次你用一个字典创建一个新的列表。

第二个是列表理解,它建立一个由0个或更多字典组成的列表,每个元素由tree.findAll()返回。

为了使第一个相当于第二,你需要定义names为空列表,然后再追加给它的循环:

names = [] 
for item in tree.findAll('item'): 
    names.append({ 
     'id': item.id.string, 
     'title': __decodefunction(item.entitle.string) 
    }) 
+0

谢谢你解释先生! –

1

我得到了

刚改为此

names = [] 
for item in tree.findAll('item'): 
    names.extend([{ 
     'id': item.id.string, 
     'title': __decodefunction(item.entitle.string) 
    }]) 
+3

不需要'.extend([])'部分;你一次只添加一个元素,所以'.append()'更有效。 –

+1

虽然你有两个解决方案可以像其他解决方案一样工作,但我建议你使用另一个解决方案,称为列表解析。它看起来更方便,pythonic我。 – glglgl