【问题标题】:Python try & expect for multiple appends in for loopPython尝试并期望for循环中的多个追加
【发布时间】:2023-09-21 01:09:02
【问题描述】:
data = {"Street" : [],
        "City" : [],
        "State" : [],
        "ZIP" : [],
        "Status" : []}

counter = 0

for i in rows:

    if len(i) == 4:

        data["Street"].append(i[2][2:])

        data["City"].append(i[3][2:-2])

        data["State"].append(i[3][-2])

        data["ZIP"].append(i[3][-1])

        data["Status"].append(i[0][-1])

我正在循环遍历嵌套列表 rows,在某些情况下项目不在列表中,在这种情况下,我收到以下错误

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-6-6b86cd54b28b> in <module>()
     29     data["Street"].append(i[2][2:])
     30 
---> 31     data["City"].append(i[3][2:-2])
     32 
     33     data["State"].append(i[3][-2])

IndexError: list index out of range

为了消除这个错误,我想只在它存在时附加项目,如果它不存在我想添加无

for i in rows:

    if len(i) == 4:

        try:
            data["Street"].append(i[2][2:])
        
        except Exception as E:
            data["Street"].append(None)

        try:

            data["City"].append(i[3][2:-2])

        except Exception as E:
            data["City"].append(None)

        try:
            data["State"].append(i[3][-2])
        except Exception as E:
            data["State"].append(None)

        try: 
            data["ZIP"].append(i[3][-1])

        except Exception as E:
            data["ZIP"].append(None)

        try:
            data["Status"].append(i[0][-1])

        except Exception as E:
            data["Status"].append(None)


        # Ans soooo on

而不是为每个append 添加多个try & except 有没有更好的方法来做到这一点...

【问题讨论】:

  • except Exception as E 可以简化我认为 - except:

标签: python list dictionary append


【解决方案1】:

我真的不知道你想做什么。我怀疑您正在尝试解析地址(是的,可能有更好的方法来做到这一点),但是鉴于您当前的代码,您可以使用要提取的切片字典来简化它:

slices = {'Street': (2, slice(2, None)),  # 2  ;  2:
          'City':   (3, slice(2, -2)),    # 3  ;  2:-2
          'State':  (3, -2),              # 3  ; -2
          # ...
         }

for i in rows:
    if len(i) == 4:
        for k, (a,b) in slices.items():
            try:
                data[k].append(i[a][b])
            except:
                data[k].append(None)

注意。在except 中,一个好的做法是指定您期望的异常类型(例如,except IndexError:

【讨论】:

    【解决方案2】:

    您可以采用这种方法:-

    data = {"Street": [],
            "City": [],
            "State": [],
            "ZIP": [],
            "Status": []}
    
    
    def da(a, r, i, s):
        try:
            a.append(r[i][s])
        except IndexError:
            a.append(None)
    
    
    da(data['Street'], [], 2, slice(2, None))
    da(data['City'], [], 3, slice(2, -2))
    da(data['State'], [], 3, -2)
    da(data['ZIP'], [], 3, -1)
    da(data['Status'], [], 0, -1)
    
    print(data)
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

              for data in (old_data, new_data):
                  try:
                      res.append(json.loads(data)[attr])
                  except (TypeError, KeyError):
                      continue
      

      这样即使随后发生异常,您也可以保留前一个元素。

      【讨论】: