Python ValueError: dictionary update sequence element #4 has length 3; 2 is required

Python ValueError: dictionary update sequence element #4 has length 3; 2 is required

我需要使用相应的键-> 值将元组转换为字典。问题是对于特定的元组,我收到以下错误:

ValueError: dictionary update sequence element #4 has length 3; 2 is required.

但是对于具有相同格式的其他元组,它可以毫无问题地进行转换。谁能指导我错误的原因是什么?
在附加的代码中,tuple1 值工作正常,但 tuple 值给出上述错误。

tupla = ['.1.3.6.1.4.1.35873.5.1.2.1.1.1.1="314"', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.2="10943"', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.3="RTU : otu-8000e-Comtec (172.17.74.133)..Alarm type: OPTICAL..Timestamp: Jan 15 2022 - 08:31..Severity: CLEAR..Link name: PROV-21-82-83-84 (PRI) RUTA 7 (PROV) - Port 2..Probable cause:"', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.5="1"', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.4="port=2"', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.6="1"', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.7="1"', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.8="0x07e6010f081f1400"', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.9="otu-8000e-Comtec (172.17.74.133)"', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.10.1="PROV-21-82-83-84 (PRI) RUTA 7 (PROV)"', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.10.2="0"', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.10.3="0.18"', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.10.4=""', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.10.5=""', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.10.6=""', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.11.1=""', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.11.2=""', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.11.3=""', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.11.4=""', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.11.5=""', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.11.6=""', '.1.3.6.1.4.1.35873.5.1.2.1.1.1.11.7=""']  
tupla1 = ['.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.1.3701361="3701361"', '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.2.3701361="CRITICAL"', '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.3.3701361="CRITICAL"', '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.4.3701361="VALE-078-001"', '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.5.3701361="Microreflection Threshold 1 Violation"', '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.6.3701361="2021-09-02T19:14:04.834Z"', '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.7.3701361="0"', '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.8.3701361="1333972"', '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.9.3701361="http://SRVXPTPRODSTG01.vtr.cl/pathtrak/analysis/view.html#/node/1333972"', '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.10.3701361="7"', '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.2.3701361.0="28400000"', '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.3.3701361.0="0"', '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.4.3701361.0="HOLA"', '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.2.3701361.0="30800000"', '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.3.3701361.0="7"', '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.4.3701361.0="CRITICAL"', '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.2.3701361.0="40700000"', '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.3.3701361.0="0"', '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.4.3701361.0="NONE"', '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.2.3701361.0="35600000"', '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.3.3701361.0="2"', '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.4.3701361.0="CRITICAL"']  
miDiccionarioTupla= dict([(tupla[x].split('"')[0]+tupla[x].split('"')[1]).split('=') for x in range(len(tupla))])  
print(miDiccionarioTupla)  
#miDiccionarioTupla1= dict([(tupla1[x].split('"')[0]+tupla1[x].split('"')[1]).split('=') for x in range(len(tupla1))])  
#print(miDiccionarioTupla1)

问题是tupla中的第五项:

'.1.3.6.1.4.1.35873.5.1.2.1.1.1.4="port=2"'

该行包含两个等号,因此最后的 .split('=') 产生了太多值。

正如 John Gordon 所指出的,数据的其中一行中有一个无关的“=”。

我不能百分百确定您希望用您的代码实现什么,但我有一个可能有助于处理无关等号的潜在解决方案。代码也可能更容易阅读:

tupla = ['.1.3.6.1.4.1.35873.5.1.2.1.1.1.1="314"',
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.2="10943"',
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.3="RTU : otu-8000e-Comtec (172.17.74.133)..Alarm type: OPTICAL..Timestamp: Jan 15 2022 - 08:31..Severity: CLEAR..Link name: PROV-21-82-83-84 (PRI) RUTA 7 (PROV) - Port 2..Probable cause:"',
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.5="1"', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.4="port=2"', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.6="1"', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.7="1"', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.8="0x07e6010f081f1400"', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.9="otu-8000e-Comtec (172.17.74.133)"', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.10.1="PROV-21-82-83-84 (PRI) RUTA 7 (PROV)"', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.10.2="0"', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.10.3="0.18"', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.10.4=""', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.10.5=""', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.10.6=""', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.11.1=""', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.11.2=""', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.11.3=""', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.11.4=""', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.11.5=""', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.11.6=""', 
         '.1.3.6.1.4.1.35873.5.1.2.1.1.1.11.7=""']  
tupla1 = ['.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.1.3701361="3701361"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.2.3701361="CRITICAL"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.3.3701361="CRITICAL"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.4.3701361="VALE-078-001"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.5.3701361="Microreflection Threshold 1 Violation"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.6.3701361="2021-09-02T19:14:04.834Z"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.7.3701361="0"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.8.3701361="1333972"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.9.3701361="http://SRVXPTPRODSTG01.vtr.cl/pathtrak/analysis/view.html#/node/1333972"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.101.1.10.3701361="7"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.2.3701361.0="28400000"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.3.3701361.0="0"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.4.3701361.0="HOLA"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.2.3701361.0="30800000"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.3.3701361.0="7"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.4.3701361.0="CRITICAL"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.2.3701361.0="40700000"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.3.3701361.0="0"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.4.3701361.0="NONE"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.2.3701361.0="35600000"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.3.3701361.0="2"', 
          '.1.3.6.1.4.1.4100.2.2.1.2.1.102.1.4.3701361.0="CRITICAL"']  

有了Python,就不需要使用对象的长度和引用对象的索引(使用[x])。我们可以简单地直接用for循环解析对象(for item in tupla):

miDiccionarioTupla = dict()
for item in tupla:           

我们可以在一个字符上拆分字符串(例如 =),并且根据这些数据,我们可以使用 maxsplit 参数选择检查多少次。

    key, value = item.split('=', maxsplit=1)    

我假设您想消除项目右侧值中的任何额外引号,因此我添加了一个 .replace() 方法调用值:(即 "CRITICAL" 变为 CRITICAL).这会将 " 的任何示例替换为空字符串,实质上删除了所有双引号。

    value = value.replace('"', '')
    miDiccionarioTupla.update({key: value})
print(miDiccionarioTupla)


miDiccionarioTupla1 = dict()
for item in tupla1:
    key, value = item.split('=', 1)
    value = value.replace('"', '')
    miDiccionarioTupla1.update({key: value})
print(miDiccionarioTupla1)