【问题标题】:Dictionary keyError on dynamic value动态值上的字典 keyError
【发布时间】:2022-07-01 07:18:34
【问题描述】:

我的 python 文件中有一个代码,如下所示。

    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)

但是当我尝试运行它时,它向我显示如下错误:

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

。谁能帮我把这个联系起来?我被困在这里。任何建议任何帮助都很重要。

我想要的输出:

[{'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
'}]

【问题讨论】:

  • 出错时请附上调试信息,如变量lineresultsresult的值。
  • 如果第一个条件不匹配,则结果字典没有组件键。
  • @Phantoms 有没有办法解决这个问题??
  • @Nehanegi 你想达到什么目标?输出应该是什么样子?
  • @Phantoms 我已经编辑了问题,你可以检查一下吗??

标签: python python-3.x python-2.7 dictionary parsing


【解决方案1】:

就像 kareem 提到的,循环逐行读取。但是“路径”行出现在“组件”行被读取之前。要解决此问题,您可以将代码更改为:

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)

不同之处在于我们更改了路径和组件如果代码行。使用此代码,您可能会获得您正在寻找的结果。我个人建议您使用列表推导来避免定义临时变量。考虑做同样事情的代码:

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))]

此代码假定组件行数和路径数相等。如果您有特殊条件,可能需要通过添加条件来更改代码。

【讨论】:

    【解决方案2】:

    出现错误是因为第一个执行 if 是第二个,因为 在第二次迭代中,第二行有“路径”并且字典 result 是空的,但是键“组件”不存在然后抛出错误。

    【讨论】:

      【解决方案3】:

      我的解决方案是删除所有空行并将列表分成 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)
      

      【讨论】:

        【解决方案4】:
        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)
        

        【讨论】:

        • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
        【解决方案5】:

        另一种方法是这样的>>

        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()
        
        my_val = ''
        result_list = []
        for line in lines:
            clean_line = line.strip()  # remove white spaces.
            if not line.strip():  # skip blank lines.
                continue
            if clean_line[:3] == 'Pat':  # if line is path.
                my_val = clean_line.split(':')[1].strip()
            if clean_line[:3] == 'Com':  # if line is components.
                my_key = clean_line.split(':')[1].strip()
                result_list.append({my_key:my_val})
        
        print(result_list)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-20
          • 2021-02-03
          • 1970-01-01
          相关资源
          最近更新 更多