Python - 匹配列表

时间:2017-07-18 14:29:56

标签: python

嘿,我一整天都在搜索和测试不同的选项而无法让我的代码工作,因为它需要...尝试comprehensionnestedfor loop但是我无法得到它右...

zipbytehex = [(1, 0, '0x1636'), (2, 1, '0x62'), (3, 2, '0x02'), (4, 3, '0x2F'), (5, 0, '0x1637'), (6, 1, '0x19'), (7, 2, '0x02'), (8, 3, '0x2F'), (13, 0, '0x1637'), (14, 1, '0x19'), (15, 2, '0x04'), (16, 3, '0x0A'), (17, 4, '0x1B'), (18, 5, '0x47'), (19, 6, '0xFF'), (20, 0, '0x1637'), (21, 1, '0x22'), (22, 2, '0x04'), (23, 3, '0x06'), (24, 4, '0x07'), (25, 5, '0x68'), (26, 6, '0xFF'), (718, 1, '0x59'), (719, 2, '0x02'), (720, 3, '0xFF'), (721, 0, '0x163C'), (722, 1, '0x59'), (723, 2, '0x02'), (724, 3, '0xFF'), (725, 0, '0x1635'), (726, 1, '0x59'), (727, 2, '0x02'), (728, 3, '0xFF'), (729, 4, '0x0C'), (730, 5, '0x42'), (731, 6, '0x00'), (732, 7, '0xAF')]

     new_zipbytehex =[]
        for i in zipbytehex:
            if i[1] != 0:
                new_zipbytehex.append(i)
        bytehexservi = []
        byteservi = []
        for i in zipbyteservi:
            if i[1:] == (1, '0x19'):
                byteservi.append(i[:2])
        service2, adatabyte2 = zip(*byteservi)   # inverse zip
        for new_bytehex in new_zipbytehex:
            if new_bytehex[1:] == (1, '0x19'):    # 0x19, 0x22, 0x59 or 0x62
                bytehexservi.append(list(zip(new_bytehex, service2, adatabyte2)))
        for list_bytehexservi in bytehexservi:
            #print(list_bytehexservi)
            sql = """INSERT INTO tblMsgsBytes2Parameters ([p_MsgBytes],[p_Parameter],[A_Databyte]) VALUES (?,?,?)"""
            cursor.execute(sql, *list_bytehexservi)
        cursor.commit()
        cursor.close()
        con.close()

我是python的新手,这是我在我的代码中得到的,现在我卡住...我正在尝试提取tuple的每个0x19和我的列表中的一次zipbytehex然后将其写入Access。我已经管理好了,每个使用(x, 1, '0x19')的元组都会被写入Access而不是一次((5, 0, '0x1637'),(6, 1, '0x19'), (7, 2, '0x02'), (8, 3, '0x2F')来自zipbytehex),我接到的唯一值是{{1}不是(6, 1, '0x19')因为我想...我需要以某种方式循环并同时附加(7, 2, '0x02') and (8, 3, '0x2F'),但我不知道......有人可以帮助我吗?感谢

例如: 我的输出:

(7, 2, '0x02') and (8, 3, '0x2F')

想要输出:

(6, 1, '0x19')

2 个答案:

答案 0 :(得分:1)

试图理解您的描述,在我看来数据是 分为元组块,第二个数字正在增加。这导致以下代码

def gen_blocks(seq):
    block = []
    threshold = -1
    for item in seq:
        if item[1] < threshold:
            yield block
            block = []
        threshold = item[1]
        block.append(item)
    else:
        if block: yield block

def gen_wanted(seq):
    for b in gen_blocks(seq):
        for i, item in enumerate(b):
            if item[2] == '0x19':
                yield b[i:]
                break

zipbytehex = [(1, 0, '0x1636'), (2, 1, '0x62'), (3, 2, '0x02'), (4, 3, '0x2F'), (5, 0, '0x1637'), (6, 1, '0x19'), (7, 2, '0x02'), (8, 3, '0x2F'), (13, 0, '0x1637'), (14, 1, '0x19'), (15, 2, '0x04'), (16, 3, '0x0A'), (17, 4, '0x1B'), (18, 5, '0x47'), (19, 6, '0xFF'), (20, 0, '0x1637'), (21, 1, '0x22'), (22, 2, '0x04'), (23, 3, '0x06'), (24, 4, '0x07'), (25, 5, '0x68'), (26, 6, '0xFF'), (718, 1, '0x59'), (719, 2, '0x02'), (720, 3, '0xFF'), (721, 0, '0x163C'), (722, 1, '0x59'), (723, 2, '0x02'), (724, 3, '0xFF'), (725, 0, '0x1635'), (726, 1, '0x59'), (727, 2, '0x02'), (728, 3, '0xFF'), (729, 4, '0x0C'), (730, 5, '0x42'), (731, 6, '0x00'), (732, 7, '0xAF')]

for x in gen_wanted(zipbytehex):
    print(x)

ouptut是

[(6, 1, '0x19'), (7, 2, '0x02'), (8, 3, '0x2F')]
[(14, 1, '0x19'), (15, 2, '0x04'), (16, 3, '0x0A'), (17, 4, '0x1B'), (18, 5, '0x47'), (19, 6, '0xFF')]

正如所料。

答案 1 :(得分:0)

您可以手动构建列表;这通常比其他技巧(如理解力)更好地完成工作。

基本上,除非已经符合0x19,否则不要在列表中放置任何内容。

data = []
for t in zipbytehex:
    if data:
        data.append(t)
    elif t[2] == '0x19':
        data.append(t)

该解决方案依赖于具有列表的布尔值的技巧。 如果data列表为空,请将元素放入其中,如果它具有0x19。 否则,data不为空,这意味着已经将0x19放入其中,因此无论如何都附加元素。