【问题标题】:Change value which is a key in the same dictionary: Python更改作为同一字典中键的值:Python
【发布时间】:2015-02-07 01:51:56
【问题描述】:

输入:

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)

【问题讨论】:

  • 您在字典中忘记了逗号。

标签: python dictionary key


【解决方案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']}

【讨论】:

  • 谢谢!现在可以了。我没有像您那样做列表列表,无法生成最终结果,感谢您的解释。
猜你喜欢
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多