Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python列表理解未分配给新数组_Python_List Comprehension - Fatal编程技术网

Python列表理解未分配给新数组

Python列表理解未分配给新数组,python,list-comprehension,Python,List Comprehension,我是python新手,我想在类构造函数中解析一些数据。输入是一个带有十六进制分隔符的字符串: b'\x01\x02A610088906\x03\x02R1138\x03\x02C\x03\x02B610089002\x03\x02SG20L71800\x03\x02MGFS4470\x03\x02m\x03\x02I47\x03\x04' 然后我想拆分这个字符串,对于每个拆分,我想将结果解码为utf-8,以丢弃我不感兴趣的其他字符: data=b'\x01\x02A610088906\x03\x

我是python新手,我想在类构造函数中解析一些数据。输入是一个带有十六进制分隔符的字符串:

b'\x01\x02A610088906\x03\x02R1138\x03\x02C\x03\x02B610089002\x03\x02SG20L71800\x03\x02MGFS4470\x03\x02m\x03\x02I47\x03\x04'

然后我想拆分这个字符串,对于每个拆分,我想将结果解码为utf-8,以丢弃我不感兴趣的其他字符:

data=b'\x01\x02A610088906\x03\x02R1138\x03\x02C\x03\x02B610089002\x03\x02SG20L71800\x03\x02MGFS4470\x03\x02m\x03\x02I47\x03\x04'
frames=data.split(b'\x02')
utf_frames=[帧中帧的帧解码('utf-8')]
打印(utf_帧)
#印刷品:
#['\x01',A610088906\x03',R1138\x03',C\x03',B610089002\x03',SG20L71800\x03',MGFS4470\x03',m\x03',I47\x03\x04']
如果我改为这样写我的理解列表,我会看到解码值打印出来:

[帧中帧的打印(帧解码('utf-8'))
A610088906
R1138
C
B610089002
SG20L71800
MGFS4470
M
I47
我使用的是3.8.5版

我做错了什么

编辑

为清楚起见,这是我想要实现的(但我不想每次都要找到一帧时解码所有条目)

解决方案

多亏了这些答案,我找到了悬空的
\x03
,自从我解码成utf-8字符串后,它就不可见了。现在可以这样做了:

frame_标识符='M'
数据=b'\x01\x02A610088906\x03\x02R1138\x03\x02C\x03\x02B610089002\x03\x02SG20L71800\x03\x02MGFS4470\x03\x02m\x03\x02I47\x03\x04'
utf_frames=[frame.decode('utf-8'),用于数据中的帧分割(b'\x02')]
frame=[frame.startswith(frame\u标识符)][0][1:-1]
打印(类型(帧)、帧、str(帧)、repr(帧))
#GFS4470 GFS4470“GFS4470”

让我们回到您的第一个编码示例,稍微修改一下,看看发生了什么:

data = b'\x01\x02A610088906\x03\x02R1138\x03\x02C\x03\x02B610089002\x03\x02SG20L71800\x03\x02MGFS4470\x03\x02m\x03\x02I47\x03\x04'
frames = data.split(b'\x02')
utf_frames = [frame.decode('utf-8') for frame in frames]
print(utf_frames)
for f in utf_frames:
    print(type(f), f, str(f), repr(f))
印刷品:

['\x01', 'A610088906\x03', 'R1138\x03', 'C\x03', 'B610089002\x03', 'SG20L71800\x03', 'MGFS4470\x03', 'm\x03', 'I47\x03\x04']
<class 'str'>   '\x01'
<class 'str'> A610088906 A610088906 'A610088906\x03'
<class 'str'> R1138 R1138 'R1138\x03'
<class 'str'> C C 'C\x03'
<class 'str'> B610089002 B610089002 'B610089002\x03'
<class 'str'> SG20L71800 SG20L71800 'SG20L71800\x03'
<class 'str'> MGFS4470 MGFS4470 'MGFS4470\x03'
<class 'str'> m m 'm\x03'
<class 'str'> I47 I47 'I47\x03\x04'
['\x01',A610088906\x03',R1138\x03',C\x03',B610089002\x03',SG20L71800\x03',MGFS4470\x03',m\x03',I47\x03\x04']
“\x01”
A610088906 A610088906“A610088906\x03”
R1138 R1138'R1138\x03'
C'C\x03'
B610089002 B610089002'B610089002\x03'
SG20L71800 SG20L71800'SG20L71800\x03'
MGFS4470 MGFS4470“MGFS4470\x03”
m'm\x03'
I47 I47'I47\x03\x04'

因此,当您打印解码帧列表而不是单独打印每个帧时,Python会选择对每个列表元素调用
repr
方法,而不是
str
方法。

让我们回到您的第一个编码示例,稍微修改一下,看看发生了什么:

data = b'\x01\x02A610088906\x03\x02R1138\x03\x02C\x03\x02B610089002\x03\x02SG20L71800\x03\x02MGFS4470\x03\x02m\x03\x02I47\x03\x04'
frames = data.split(b'\x02')
utf_frames = [frame.decode('utf-8') for frame in frames]
print(utf_frames)
for f in utf_frames:
    print(type(f), f, str(f), repr(f))
印刷品:

['\x01', 'A610088906\x03', 'R1138\x03', 'C\x03', 'B610089002\x03', 'SG20L71800\x03', 'MGFS4470\x03', 'm\x03', 'I47\x03\x04']
<class 'str'>   '\x01'
<class 'str'> A610088906 A610088906 'A610088906\x03'
<class 'str'> R1138 R1138 'R1138\x03'
<class 'str'> C C 'C\x03'
<class 'str'> B610089002 B610089002 'B610089002\x03'
<class 'str'> SG20L71800 SG20L71800 'SG20L71800\x03'
<class 'str'> MGFS4470 MGFS4470 'MGFS4470\x03'
<class 'str'> m m 'm\x03'
<class 'str'> I47 I47 'I47\x03\x04'
['\x01',A610088906\x03',R1138\x03',C\x03',B610089002\x03',SG20L71800\x03',MGFS4470\x03',m\x03',I47\x03\x04']
“\x01”
A610088906 A610088906“A610088906\x03”
R1138 R1138'R1138\x03'
C'C\x03'
B610089002 B610089002'B610089002\x03'
SG20L71800 SG20L71800'SG20L71800\x03'
MGFS4470 MGFS4470“MGFS4470\x03”
m'm\x03'
I47 I47'I47\x03\x04'

因此,当您打印解码帧列表而不是单独打印每个帧时,Python选择对每个列表元素调用
repr
方法,而不是
str
方法。

Python不
打印列表的内容,只打印其结构。如果使用列表理解,python将打印列表的每个元素。所以控制台中没有出现控制字符。

Python不打印列表的内容,只打印其结构。如果使用列表理解,python将打印列表的每个元素。所以控制台中没有出现控制字符。

正在使用linux吗?是的,Ubuntu 20.04
/xo3
^c
字符;
ctrl+c
。当我没有指定给列表时,为什么会打印所有帧?
\x03
是否也会引起问题?是的,这是我似乎无法重现的,因为我在linux和windows中也获得了一个空白框字符;是的,Ubuntu 20.04
/xo3
^c
字符;
ctrl+c
。当我没有指定给列表时,为什么会打印所有帧?
\x03
是否也会引起问题?是的,这是我似乎无法重现的,因为我在linux和windows中也获得了一个空白框字符;这是意料之中的。非常感谢,这很好地解释了很多。非常感谢,这很好地解释了很多。谢谢!我把另一个标记为答案,因为如果没有一个例子我是不会理解的谢谢!我把另一个标记为答案,因为如果没有一个例子,我是不会理解的