Home > Back-end >  Dictionary keyError on dynamic value
Dictionary keyError on dynamic value

Time:04-22

I have a code in my python file that is given below.

    data_to_parse = """
    Repo: 2msdsdodule-losdsdader
    Path: 2modsdsule-loasdsdder
    Components: 2sssss-sdsds sds-sdsd-test sdsd-load-sdsds
    
    Repo: 1msdsdodule-losdsdader
    Path: 1modsdsule-loasdsdder
    Components: 1libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds
        
    Repo: 3msdsdodule-losdsdader
    Path: 3modsdsule-loasdsdder
    Components: 3libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds
    
    """
    lines = data_to_parse.splitlines()#print(lines,'-----')
    result_list = []
    result = {}
    
    for line in lines:
        results = {}
        if 'Components:' in line:
           line2 = line.split(':')
           result['Components']= (line2[1].strip())

        if 'Path:' in line:
           line2 = line.split(':')
           result['Path'] = (line2[1].strip())
           results[result['Components']] = result['Path']
           result_list.append(results)

print(result_list)

But when i tried to run this it is showing me the error like :

results[result['Components']] = result['Path']
KeyError: 'Components'

.can anyone please help me relate this ?? I am stuck here. any suggestions any help would be matter.

Output i want like :

[{'2sssss-sdsds sds-sdsd-test sdsd-load-sdsds':'2msdsdodule-losdsdader'}
{'1libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds':'1msdsdodule-losdsdader'},
{'3libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds':'3msdsdodule-losdsdader
'}]

CodePudding user response:

The error appear because the first execuat if is second one because In second iteration the second line have "path" and the dict result is empty yet then the key "Components" isn't exist then the error throwing.

CodePudding user response:

My solution is tio remove all of the empty lines and divide the list into chunks of 3.

data_to_parse = """
    Repo: 2msdsdodule-losdsdader
    Path: 2modsdsule-loasdsdder
    Components: 2sssss-sdsds sds-sdsd-test sdsd-load-sdsds

    Repo: 1msdsdodule-losdsdader
    Path: 1modsdsule-loasdsdder
    Components: 1libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds

    Repo: 3msdsdodule-losdsdader
    Path: 3modsdsule-loasdsdder
    Components: 3libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds
    """


def chunks(lst, n):
    """Yield successive n-sized chunks from lst."""
    for i in range(0, len(lst), n):
        yield lst[i:i   n]


lines = [line.strip() for line in data_to_parse.splitlines() if line]  # list without empty lines
result_list = []

for chunk in [chunk for chunk in chunks(lines, 3) if len(chunk) == 3]:
    result = {chunk[2]: chunk[1]}
    print(result)
    result_list.append(result)

CodePudding user response:

Like kareem mentioned, the loop reads line by line. But the 'Path' line comes before 'Component' line has been read. To solve this you may change your code as:

lines = data_to_parse.splitlines()#print(lines,'-----')
result_list = []
result = {}
    
for line in lines:
    results = {}
    if 'Path:' in line:
        line2 = line.split(':')
        result['Path'] = (line2[1].strip())
    
    if 'Components:' in line:
        line2 = line.split(':')
        result['Components']= (line2[1].strip())

        results[result['Components']] = result['Path']
        result_list.append(results)

The difference is we changed Path and Component if code lines. With this code you may reach the result, which you are looking for. Personally I would recommend you to use list comprehension to avoid defining temporary variables. Consider the code which does the same thing:

lines = data_to_parse.splitlines()
components = [line.split(':')[1].strip() for line in lines if 'Components' in line]
path = [line.split(':')[1].strip() for line in lines if 'Path' in line]
result_list = [{components[i]:path[i]} for i in range(len(components))]

This code assumes that there are equal number of components lines and paths. If you have special conditions, you may need to change the code by adding conditions.

CodePudding user response:

data_to_parse = """Repo: 2msdsdodule-losdsdader
Path: 2modsdsule-loasdsdder
Components: 2sssss-sdsds sds-sdsd-test sdsd-load-sdsds

Repo: 1msdsdodule-losdsdader
Path: 1modsdsule-loasdsdder
Components: 1libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds
    
Repo: 3msdsdodule-losdsdader
Path: 3modsdsule-loasdsdder
Components: 3libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds
"""
# print(data_to_parse)

lines = data_to_parse.splitlines()#print(lines,'-----')
result_list = lines
# print(result_list)
result = {}
# print(result)

for line in result_list:
    # results = {}
    print(line)
    if 'Components:' in line:
        line2 = line.split(':')
        # print(line2)
        result['Components']= (line2[1].strip())
        # print(result)
    if 'Path:' in line:
       line2 = line.split(':')
       result['Path'] = (line2[1].strip())
       result['Components'] = result['Path']
       result_list.append(result)

print(result_list)
  • Related