2016-01-23 70 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