2013-06-01 3 views
3

Я не понимаю, почему эти 2 утверждения не равны.python dict в списке on for loop

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

Хотя у вас есть два решения, которые работают так же, как и другие, я бы предложил вам использовать другой, называемый пониманием списка. Это выглядит более удобным и пифоничным для меня. – glglgl