2015-02-07 215 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

你忘了逗号。 – 2015-02-07 02:02:26

回答

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 2015-02-08 01:15:59

相关问题