嘿,我一整天都在搜索和测试不同的选项而无法让我的代码工作,因为它需要...尝试comprehension
和nestedfor 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')
答案 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
放入其中,因此无论如何都附加元素。