2017-07-18 32 views
0

嘿,我一直在搜索和測試不同的選項整天,無法讓我的代碼工作,因爲它想... comprehensionnestedfor loop,但我不能把它正確...Python - 比賽列表

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

進出口新的蟒蛇,這是據我在我的代碼和現在即時通訊卡......我正嘗試提取每tuple0x19和後一次從我的名單zipbytehex然後寫它訪問。我已經管理,使(x, 1, '0x19')每個元組被寫入到Access但不是一次後(從從zipbytehex),我得到的唯一的價值是(6, 1, '0x19')而不是(7, 2, '0x02') and (8, 3, '0x2F')因爲我想...我需要以某種方式循環通過並在同一時間附加(7, 2, '0x02') and (8, 3, '0x2F'),但我不知道如何...有人可以幫助我嗎?由於

例如: 我的輸出:

(6, 1, '0x19') 

想輸出:

(6, 1, '0x19') 
(7, 2, '0x02') 
(8, 3, '0x2F') 
+2

等一下,按照什麼標準選擇遵循'0x19'的元組?你只是想要接下來的兩個元素? –

回答

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

預期。

+0

感謝您的幫助!是的,當然,我試着詳細說明一下,整個字符串實際上是ex,(0x1636 62 02),你可以在zipbytehex中看到,第一個是ID形式訪問,第二個變量是每個sting中有多少十六進制數的計數器,第三個是十六進制數。所以一些字符串可以是3個十六進制數字,一些是十進制的十六進制數字(不在ex中顯示)「0x16XX XX XX XX ...」。所以即時通訊嘗試提取索引十六進制「0x19」每個字符串。所以它可以打印,如問題「想要的打印」所示,我不能自己做,謝謝 – sesar

+0

對於我來說,「想要的打印」部分仍然沒有解釋規則。請參閱上面的@Right leg的評論。你怎麼知道你想在'(6,1,'0x19')'後面有2個項目。 – Gribouillis

+0

謝謝你,這正是我想要的!對不起,我的問題是這樣一個不好的解釋...我有另一個功能拆分字符串(16XX ZZ YY WW ...),並給每個拆分一個數字(所以16XX = 0,ZZ = 1,YY = 2 WW​​ = 3,這個數字是gose(6,* here *,'0x19'),這就是我知道我需要的號碼後,它的計數器0,1,2,3,4 .... – sesar

0

您可以手動建立您的列表;這通常比其他技巧如理解更好地完成工作。基本上,除非已經符合0x19,否則不要在您的列表中放入任何東西,除非已經滿足0x19

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

該解決方案依賴與列表的布爾值的技巧。 如果data列表爲空,則將該元素放入其中,如果它具有0x19。 否則,data不是空的,這意味着一個0x19已被放入它,所以追加元素,無論如何。