我应该如何将元组列表转换为单独的字符串?

时间:2016-01-23 12:30:25

标签: python

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加热器控制电路”)作为其自己的变量。我是否需要将此输出解码为列表或元组或两者?

3 个答案:

答案 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 iddesc,以便P0030存储在id中并存储HO2S Heater Control Circuitdesc