Почему списки удаляют int? - PullRequest
0 голосов
/ 15 апреля 2019

Я написал фрагмент кода, который распаковывает структуру в следующем формате:

----------------------------------------------------------
|  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)

Вывод is:

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 ')

Почему было удалено первое целое число?

1 Ответ

1 голос
/ 15 апреля 2019

Вы отфильтровали свой список вывода только по строкам, потому что вы включили тест 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:]]
...