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 :(得分: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]
分配给变量。
答案 1 :(得分: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
如果你因为某些原因想要它们,也可以使用带有上述逻辑的列表comp或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)
获取最后的元素。
答案 2 :(得分:0)
你可以“解包”一个元组。因此,从您的示例中,r.value[0]
是元组("P0030", "HO2S Heater Control Circuit")
然后,
id, desc = r.value[0]
会将元组,r.value [0]解压缩到varaiables id
和desc
,以便P0030
存储在id
中并存储HO2S Heater Control Circuit
在desc