更改值是同一个字典中的键:Python

时间:2015-02-07 01:51:56

标签: python dictionary key

输入:

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)

1 个答案:

答案 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']]

有意创建列表列表(即使是单个元素),以便以后可以统一展平(跨所有项目),而不关心某些项目是否真的没有有任何嵌套的键值(如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']}