2016-01-23 2 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 (если таковые имеются).

Так что если 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 id и desc так, что P0030 хранится в id и HO2S Heater Control Circuit хранится в desc

1

Если вы хотите использовать каждый второй элемент, который вы можете распаковать кортежи в цикле:

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

Смежные вопросы