2015-02-07 3 views
1

Вход:Изменить значение, которое является ключевым в том же словаре: Python

oldNames = { 'Fruits':['orange', 'Banana', 'Peach', 'mango', 'raspberries'] 
      'Meat': ['Bacon', 'Chicken', 'Ham', 'Steak'] 
      'Food': ['Fruits', 'Rice', 'Beans', 'Meat'] } 

Пример кода:

oldNames = {} # Defining the dictionary I am creating from the file 
newNames = {} # Defining another dictionary where I am planning to change the values 
Keys_ = [] # Defining the list to append new values for new dictionary 
Values_ = [] 

def dict_parse(): 
    infiles = [f for f in os.listdir(path) if f.endswith('.pin')] # First few lines gets the match fromt he input file 
    for infile in infiles: 
     with open(path + '/' + infile, 'r') as inFile: 

      infileContents = inFile.read() 
      PATTERN = re.compile(r'Group (\w+)\s+([^\n]+)\s*\{(.*?)\}', re.DOTALL); 


      for match in PATTERN.finditer(infileContents): 
       keyname = match.group(1).strip() 
       elements = match.group(3).replace(',', '').split() 
       oldNames[keyname] = elements # I get the correct dictionary values until here. 

       for keyname, elements in oldNames.items():  # iterating over the keys and values of existing dict 
        for element in elements: # iterating over values 
         if (element in oldNames[keyname]):  # condition to check if vlaue is a key 
          newNames = {} 
          for i in range(len(oldNames[keyname])): 
           Values_.append(oldNames[keyname][i])  # This part is wrong but not sure how to modify 
           newNames= dict((k,v) for k,v in (oldNames[keyname], Values_))  # This is not the correct format to form the dict I guess... 
         else: 
          newNames = dict((k,v) for k,v in oldNames[keyname]) 


       print new_pinNames["Food"] 



if __name__ =='__main__': 
    dict_parse() 

У меня есть значения в виде списка. Я использую for loop для перебора списка значений и другого for loop для повторения значений совпадающих ключей. Мне нужен вывод в виде единого списка со значениями замененных ключей и находится в том же положении, что и раньше. Отправленный образец для справки.

Я распечатываю один ключ, но мне нужен новый словарь со всеми найденными значениями и заменен.

Ожидаемый результат:

['orange', 'Banana', 'Peach', 'mango', 'raspberries', 'Rice', 'Beans', 'Bacon', 'Chicken', 'Ham', 'Steak']  

Ссылка:

Used this : [This](http://stackoverflow.com/questions/3162166/python-looping-over-one-dictionary-and-creating-key-value-pairs-in-a-new-dictio) 

+0

Вы забыли запятые в вашем словаре. –

ответ

1

Это будет работать ... Однако, это определенно может привести к путанице при использовании синтаксиса на слух для достижения такой сложности.

print dict(
    [(key, [y for x in [[i] if i not in oldNames else oldNames[i] 
     for i in value] for y in x]) 
    for key, value in oldNames.items()]) 

Итак, что вы можете сделать вместо этого (если это слишком запутанным для вас), это написать его так:

newNames = {} 
for key, value in oldNames.items(): 
    valueLists = [[i] if i not in oldNames else oldNames[i] for i in value] 
    newNames[key] = [] 
    for valueList in valueLists: 
     newNames[key].extend(valueList) 

print newNames 

Объяснение: По существу, в получившийся valueLists первый цикл будет выглядеть так:

# Using the 'Food' key 
[['orange', 'Banana', 'Peach', 'mango', 'raspberries'], ['Rice'], ['Beans'], ['Bacon', 'Chicken', 'Ham', 'Steak']] 

A список списков (даже для отдельных элементов) создается намеренно, чтобы впоследствии можно было равномерно сгладить (по всем пунктам), не заботясь, если на некоторых элементах фактически не было вложенных значений ключа (например, fruits). Это позволяет легко добавлять или удалять элементы, которые имеют разнесение ключевых значений, и ожидать, что такое же поведение будет работать все время.

# Here I iterate through valueLists, thus the first 
    # item in the loop would be (using the above example): 
    # ['orange', 'Banana', 'Peach', 'mango', 'raspberries'] 
    for valueList in valueLists: 
     # Finally, the `extend` flattens it completely. 
     newNames[key].extend(valueList) 

В выходные:

{'Food': ['orange', 'Banana', 'Peach', 'mango', 'raspberries', 'Rice', 'Beans', 'Bacon', 'Chicken', 'Ham', 'Steak'], 'Meat': ['Bacon', 'Chicken', 'Ham', 'Steak'], 'Fruits': ['orange', 'Banana', 'Peach', 'mango', 'raspberries']} 
+0

Спасибо! Он работает сейчас. Я не делал список списков, как вы это делали, и не смог получить окончательный результат и спасибо за объяснение. – Doodle

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