为什么列表理解会删除一个int?

时间:2019-04-15 18:39:21

标签: python python-2.7 list-comprehension

我编写了一段代码,以这种格式解压缩结构:

----------------------------------------------------------
|  1 unsigned char | 7 char | 13 char | 7 char | 50 char |
----------------------------------------------------------

因此,当我执行此代码时:

datagram = unpack('1B7s13s7s50s',raw_datagram[0])
print len(datagram)
datagram = [data.replace('\x00','') for data in list(datagram) if isinstance(data, str)]
print len(datagram)

输出为:

5  
4

raw_datagram[0]是:

  

(0,'SW-01 \ x00 \ x00','89F107457A36 \ x00','000000 \ x00','\ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00')

为什么删除第一个整数?

1 个答案:

答案 0 :(得分:1)

您只对字符串过滤了输出列表,因为列表理解中包括了if ...测试:

[data.replace('\x00','') for data in list(datagram) if isinstance(data, str)]
#                        all entries in datagram,   that are strings

这等效于:

new_datagram = []
for data in list(datagram):
    if isinstance(data, str):
        new_value = data.replace('\x00','')
        new_datagram.append(new_value)
datagram = new_datagram

您要改用条件表达式

new_datagram = []
for data in datagram:
    new_value = data.replace('\x00','') if isinstance(data, str) else data
    new_datagram.append(new_value)
datagram = new_datagram

或者,作为列表理解:

datagram = [data.replace('\x00','') if isinstance(data, str) else data for data in datagram]

我在这里使用str.rstrip('\x00'),因为空字节可能仅用作长度填充:

datagram = [data.rstrip('\x00') if isinstance(data, str) else data for data in datagram]

并且因为您已经知道格式,所以只需要将此格式应用于字符串的4个元素:

datagram = [datagram[0]] + [data.rstrip('\x00') for data in datagram[1:]]