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