在Python中对列表重新排序,以确保它以检查值开头

在Python中对列表重新排序,以确保它以检查值开头,python,list,Python,List,我使用Pyserial读取串行数据,以256Hz的采样率填充17个值(每个值1字节)的列表 我最终想要使用的字节是列表中的第5到第8个字节。如果不删除任何字节,则流的前两个值始终相同('165','90')。但是我得到了很多被删除的值,并且我的列表值正在移动,所以当我读取第5-8字节时,它们不是正确的值 我已经部分地解决了这一问题,确保在捕获想要的序列之前,根据它们应该是什么来检查前几个值(即,如果mylist[0]==165&..。 这是粗略的,但还可以,因为这两个值在其他地方的列表中彼此相邻

我使用Pyserial读取串行数据,以256Hz的采样率填充17个值(每个值1字节)的列表

我最终想要使用的字节是列表中的第5到第8个字节。如果不删除任何字节,则流的前两个值始终相同('165','90')。但是我得到了很多被删除的值,并且我的列表值正在移动,所以当我读取第5-8字节时,它们不是正确的值

我已经部分地解决了这一问题,确保在捕获想要的序列之前,根据它们应该是什么来检查前几个值(即,如果mylist[0]==165&..。
这是粗略的,但还可以,因为这两个值在其他地方的列表中彼此相邻的可能性很小。 问题是,这意味着一旦字节移位,我就会丢失一堆值,直到它最终重新对齐

我的问题是:我可以使用什么代码来:

a) 一旦检测到列表不再以165,90开头,则强制列表重新对齐。(elif…)

b) 检测“165”和“90”在列表中的位置(彼此相邻),并根据它们的位置提取我想要的值(下一个但一个,以后)

提前谢谢

美国

刚刚从相关的Qs中注意到我可以使用

mylist.append(mylist.pop(0)) 

多次,直到他们在正确的地方。有没有更好的建议?

如果我能很好地理解你, 假设您有这样一个列表:

l = [67, 126, 165, 90, 11, 1, 3, 5, 151, 99, 23]
while True:    
    mylist.extend(get_more_data())

    # If we're misaligned, skip bytes until we're aligned again
    while mylist and mylist[0] != 165 or mylist[1] != 90:
        mylist.pop(0)

    # If we've skip bytes, we might not have enough data, so get more
    if len(mylist) < 17:
        continue

    # Process one chunk of data and remove it from the list
    process_data(mylist[:17])
    del mylist[:17]
您希望获得: 有用=[3,5151,99]

然后,你可以做:

# obtain places where 165 is followed by 90
match = [x for x in xrange(len(l)-1) if l[x]==165 and l[x+1]==90]
# obtain range of useful values
useful = l[match[0]+4:match[0]+8]
如果我误解了你的问题,你可能得调整一下数字。 希望有帮助


Manuel

如果我理解您的问题是正确的,您的数据将以17字节的块连续到达。假设这是对的,像这样的事情怎么样:

l = [67, 126, 165, 90, 11, 1, 3, 5, 151, 99, 23]
while True:    
    mylist.extend(get_more_data())

    # If we're misaligned, skip bytes until we're aligned again
    while mylist and mylist[0] != 165 or mylist[1] != 90:
        mylist.pop(0)

    # If we've skip bytes, we might not have enough data, so get more
    if len(mylist) < 17:
        continue

    # Process one chunk of data and remove it from the list
    process_data(mylist[:17])
    del mylist[:17]
为True时:
扩展(获取更多数据())
#如果未对齐,请跳过字节,直到再次对齐为止
而mylist和mylist[0]!=165或mylist[1]!=90:
mylist.pop(0)
#如果我们跳过了字节,我们可能没有足够的数据,所以获取更多
如果len(mylist)<17:
持续
#处理一个数据块并将其从列表中删除
处理数据(mylist[:17])
德尔迈利斯特[:17]

我将使用165和90作为头值,始终检查传入字节是否匹配。此解决方案自动重新同步自身,其简单程度如下:

def get_message():
    while True: #Some timeout functionality is useful here ;-)
       message = []
       byte = xxx.get_byte()
       if byte == 165:
          byte = xxx.get_byte()
          if byte == 90:
             xxx.get_byte() #drop it
             xxx.get_byte() #drop it
             message[0] = xxx.get_byte()
             message[1] = xxx.get_byte()
             message[2] = xxx.get_byte()
             message[3] = xxx.get_byte()
             #Break out of loop. We have a message! 
             return message

如果你设计两面,你真的应该插入一些校验和。如果你只是黑客的东西,在字节中寻找一个校验和。它可能已经存在了。

您确实需要解决删除这么多字节的原因。如果将字节放在(165,90)之后,会发生什么情况?您将得到第6-9个字节,这将是垃圾。您使用的是高质量的串行电缆吗?它有多长?问题在于它是一个RS232-USB适配器,它也只有1英尺长!干杯