2016-01-23 72 views
0
import obd 
connection = obd.OBD() 
r = connection.query(obd.commands.GET_DTC) 
print(r.value) 


example output: 
[ 
    ("P0030", "HO2S Heater Control Circuit"), 
    ("P1367", "Unknown error code") 
] 

我想在每个输出项目(例如“HO2S加热器控制电路”)中存储/访问第二个值作为它自己的变量。我是否需要将此输出解码为列表或元组,还是两者?我应该如何将元组列表转换为单独的字符串?

+0

你是什么意思,“作为自己的变量”?你想压扁“列表”吗?或者你问如何访问嵌套的项目?或者你只需​​要可变容器?请更具体一些。 – TigerhawkT3

+0

类似于:'first,second = r.value [0]'? – Bakuriu

回答

1

the page where this code seems to be from

响应对象的值字段将包含元组的列表,其中每个元组包含DTC,和DTC的字符串描述(如果可用)。

因此,如果r = connection.query(obd.commands.GET_DTC),那么r.value是“元组列表”。您可以使用zip()功能(如this question描述)与zip(*r.value)这给

[('P0030', 'P1367'), ('HO2S Heater Control Circuit', 'Unknown error code')] 

你只是想这个列表的第二个元素转置结构,所以

zip(*r.value)[1] 

给你的元组

('HO2S Heater Control Circuit', 'Unknown error code') 

然后你可以使用这个,如你所愿。请注意,这给你所有的“每个输出项目的第二个值”。你可以通过所有这些迭代(和,比如说打印各一个)有:

for description in zip(*r.value)[1]: 
     print description 

可能分配zip(*r.value)[1]一个变量是一个好主意,如果你想使用它不止一次。

0

你可以“解开”一个元组。所以,从你的榜样,r.value[0]是元组("P0030", "HO2S Heater Control Circuit")然后,

id, desc = r.value[0] 

将解压的元组,r.value [0]到varaiables iddesc,使P0030存储在idHO2S Heater Control Circuit存储在desc

1

如果你要使用的每个第二个元素,你可以解开元组在for循环中:

for _, var in r.value: 
    # use var 

即:

In [4]: l = [                       
    ("P0030", "HO2S Heater Control Circuit"), 
    ("P1367", "Unknown error code") 
] 

In [5]: for _, var in l: 
      print(var) 
    ...:  
HO2S Heater Control Circuit 
Unknown error code 

如果你想他们都因为某些原因也可以用列表比较与上面的逻辑或operator.itemgetter

In [7]: list(map(itemgetter(1), l)) 
Out[7]: ['HO2S Heater Control Circuit', 'Unknown error code'] 

In [8]: from operator import itemgetter 

In [9]: list(map(itemgetter(1), l)) 
Out[9]: ['HO2S Heater Control Circuit', 'Unknown error code'] 

你也可以使用itemgetter(-1)得到最后的元素。

+1

这比我的答案简单得多。 – e0k