2015-09-24 4 views
-1

Я новичок в программировании, поэтому заранее извиняюсь за любой дрянной код. Этот пример - упрощенная версия моей проблемы. Я получаю данные из двух отдельных файлов, указанных здесь как списки (например, filea и fileb). То, что я хотел бы сделать, это создать единственный словарь (data_dict), для которого ключ является идентификационным номером; здесь как первый элемент в списке (например, 100). Значение будет списком, который добавляется при обновлении. В первом цикле (filea) идентификатор добавляется к списку значений, а затем добавляется значение данных (для этого примера a9999), а затем добавляется в словарь для этого ключа (id).Python обновления ключей и значений в словаре в цикле

Проблема, с которой я столкнулась, заключается в том, чтобы попытаться добавить второй цикл (fileb) правильно. Последний словарь - это результат второго цикла (fileb), который можно увидеть в b9999. Я явно делаю что-то неправильно с извлечением значения ключа из первого цикла, чтобы добавить вторую точку данных во второй цикл. Конечным словарем, который я пытаюсь достичь, является {100: [100, 'a9999', 'b9999'], 101: [100, 'a9999', 'b9999']} без ввода идентификатора дважды в каждый список (например, , [100, «a9999», 100, «b9999»])

filea = [[100,1],[101,1]] 
fileb = [[100,2],[101,2]] 

def my_func(): 
    data_dict = {} # a dictionary to hold all data 
    for file in [[filea],[fileb]]: 
     name = extra_func(file) #this is only added for the simplified example 
     for lists in file: 
      for digit_list in lists: 
       value_list = [] # the list that will be the value of each key in data_dict 
       id = digit_list[0] #the first item in the list will be the id number 
       digit_list.pop(0) #then drop the id number from the list 
       data_dict[id] = id #create a key based on the id number 
       #print [data_dict.get(id)] # get the value for that key 
       value_list.append(id) #append the id to the value_list 
       data = 9999 #this is a placeholder for the example 
       value_list.append(name + str(data)) #append the data with name (a or b) for readability 
       data_dict[id] = value_list #add the value the key (id) 
       #print "data_dict for ", id, data_dict,"\n" 
      print "data_dict for all ids in file",name, "\n", data_dict,"\n" 
    return data_dict 

def extra_func(file): 
    if file == [filea]: #this is only added for the simplified example 
     name = 'a' 
    if file == [fileb]: 
     name = 'b' 
    return name 

data_dict = my_func() 
print "final dictionary", data_dict 
+2

чем проблема, я читал и читать, но не может понять, что вы хотите достичь именно ... – Richard

+0

К сожалению. Я старался быть ясным, но не думаю. Проблема в том, что последний словарь содержит только значения для второго цикла; те значения из fileb – veganscript

ответ

0

Первая строка в вашем внутреннем цикле является началом этой проблемы: вы всегда начинаются со свежим списком. Вместо этого используйте метод dict.get, чтобы получить то, что вы хотите для стартового списка. Затем просто добавьте новые данные.

for lists in file: 
     for digit_list in lists: 
      # Get the existing list for this ID. 
      # If none, start a new one. 
      id = digit_list[0] #the first item in the list will be the id number 
      value_list = data_dict.get(id, [id]) 

      digit_list.pop(0) #then drop the id number from the list 
      data_dict[id] = id #create a key based on the id number 
      #print [data_dict.get(id)] # get the value for that key 
      data = 9999 #this is a placeholder for the example 
      value_list.append(name + str(data)) #append the data with name (a or b) for readability 
      data_dict[id] = value_list #add the value the key (id) 
      #print "data_dict for ", id, data_dict,"\n" 
     print "data_dict for all ids in file",name, "\n", data_dict,"\n" 
+0

Спасибо! Это так полезно. – veganscript

+0

Рад помочь. Когда вы столкнетесь с проблемой, не забудьте «принять» один ответ или сделать что-то еще, чтобы соответствующим образом удалить вопрос из «открытого» списка. – Prune

+0

Это был мой первый пост. Я ценю ваше руководство. – veganscript

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