2016-11-07 2 views
0

Я хочу добавить значения в словарь, если они присутствуют в моем файле под определенным ключом. Если ключ уже существует в словаре. В противном случае я хочу создать ключ с его значением. Например:Ключ в dict.keys() не распознается для добавочных значений

f=open('Fruits.txt','r') 
for line in f: 
    field=line.split('\t') 
    fruits={} 
    if 'Gala' in field[4] and 'Apples' in fruits.keys(): 
     print 'Cider' 
     fruits['Apples'].append('Gala') 
    elif 'Gala' in field[4]: 
     fruits['Apples']='Gala' 
     print fruits.keys() 

f.close 

Когда я запускаю этот скрипт. Я не получаю сообщение об ошибке, но «Сидр» не печатается, указывая, что ключ «Яблоки» не распознается в словаре фруктов. В то же время печатающие fruits.keys() делает для каждой строки печати:

[ «яблоки»]

Однако, когда я удалить (все) отступы до печати fruits.keys(), он печатает :

[]

вы знаете, почему ключ «яблоки» забывается и/или не распознан ли?

Спасибо заранее!

+1

Я вижу, ваш первый (и, возможно, только) вопрос создания нового словаря для каждого Iterable в е. Я бы переместил эту строку за цикл for. –

ответ

0

У вас есть несколько проблем в вашем примере:

for line in f: 
    field=line.split('\t') 
    fruits={} 

Вы должны инициализировать fruits словарь перед петлей. В противном случае вы получите новый словарь для каждой строки.


fruits['Apples'].append('Gala')

На первой итерации это гарантированно поднять KeyError. Ваш словарь пуст, но вы предполагаете, что он уже имеет Apples как ключ и пустой список в качестве значения. Вы должны убедиться, что перед тем, как попробовать append, или еще лучше, используйте defaultdict, который спасет вас от суеты.


f.close

close является функцией, так что эта линия должна быть f.close().


Подводя итог:

from collections import defaultdict 

f = open('Fruits.txt','r') 
fruits = defaultdict(list) 
for line in f: 
    field=line.split('\t') 

    if 'Gala' in field[4] and 'Apples' in fruits.keys(): 
     print 'Cider' 
     fruits['Apples'].append('Gala') 
    elif 'Gala' in field[4]: 
     fruits['Apples']='Gala' # This line will change the value to a string 
           # so you won't be able to "append" to it anymore. 
           # I'm not sure what you tried to do here. 
     print fruits.keys() 

f.close() 

или даже лучше, использовать with для обработки открывающимися и закрытие файла для вас:

from collections import defaultdict 

fruits = defaultdict(list) 
with open('Fruits.txt','r') as f: 
    for line in f: 
     field = line.split('\t') 

     if 'Gala' in field[4] and 'Apples' in fruits.keys(): 
      print 'Cider' 
      fruits['Apples'].append('Gala') 
     elif 'Gala' in field[4]: 
      fruits['Apples'] = 'Gala' 
      print fruits.keys() 
+0

Небольшое улучшение: 'in' на дикторе всегда будет искать ключи, поэтому' 'Яблоки 'в fruit.keys()' могут быть просто «Яблоки» в фруктах ». –

0

Ваш Queston необходимо очистить где вы приходите с ключом и ценностями?! Ниже приведен пример, но вы должны выбрать ключ и значение на основе вашей проблемы:

Попробуйте это:

f=open('Fruits.txt','r') 
fruits= defaultdict(list) 
for line in f: 
    field=line.split('\t') 
    fruits['Apples'].append('Gala') 
f.close 

 Смежные вопросы

  • Нет связанных вопросов^_^