многомерный массив (вложенный цикл) не работает должным образом и возвращает дублированные неверные результаты - PullRequest
1 голос
/ 18 мая 2019

У меня есть двумерный массив (вложенный цикл), который сравнивает два списка, правильный формат и неправильный формат, используя расстояние Хемминга, в котором, если разница между строками в правильном и неправильном формате = 1, это добавляет правильный формат ктретий список «исправлен» и удаляет форматированную строку из списка неправильного формата.

данные в списках выглядят так:

['BWI0520BG6,ATT7791R,AMS,DEN,1420564394,1001\n',
 'BWI0520BG6,BER7172M,KUL,LAS,1420565167,1848\n',]

, поэтому мне нужно нарезать их, чтобы получить каждыйчасть списка для сравнения правильных и неправильных списков

код, используемый для сравнения между ними

corrected = []
correct_format = ['EZC9678QI6,VYW5940P,LAS,SIN,1420565203,1843\n',
 'EZC9678QI6,RUM0422W,MUC,MAD,1420563539,194\n',
 'CKZ3132BR4,XXQ4064B,JFK,FRA,1420563917,802\n',
 'HCA3158QA6,GMO5938W,LHR,PEK,1420564317,1057\n',
 'JBE2302VO4,VDC9164W,FCO,LAS,1420564698,1276\n',
 'XFG5747ZT9,PME8178S,DEN,PEK,1420564409,1322\n',
 'CDC0302NN5,QHU1140O,CDG,LAS,1420564498,1133\n',
 'CYJ0225CH1,YZO4444S,BKK,MIA,1420565330,2027\n',
 'PIT2755XC1,VYW5940P,LAS,SIN,1420565203,1843\n',
 'IEG9308EA5,SQU6245R,DEN,FRA,1420564460,1049\n',
 'LLZ3798PE3,ULZ8130D,CAN,DFW,1420564983,1683\n',
 'LLZ3798PE3,MBA8071P,KUL,PEK,1420563856,572\n', 
 'PIT2755XC1,SOH3431A,ORD,MIA,1420563649,250\n',
 'XFG5747ZT9,XXQ4064B,JFK,FRA,1420563917,802\n',
 'HCA3158QA6,SQU6245R,DEN,FRA,1420564460,1049\n',
 'JBE2302VO4,HZT2506M,IAH,AMS,1420564324,1044\n',
 'VZY2993ME1,WSK1289Z,CLT,DEN,1420563542,278\n',
 'SJD8775RZ4,TMV7633W,UGK,DXB,1420563958,849\n',
 'EDV2089LK5,ATT7791R,AMS,DEN,1420564394,1001\n',
 'SPR4484HA6,VDC9164W,FCO,LAS,1420564698,1276\n',
 'UES9151GS5,DAU2617A,CGK,SFO,1420564986,1811\n',
 'WBE6935NU3,KJR6646J,IAH,BKK,1420565203,1928\n',  
 'CDC0302NN5,XIL3623J,PEK,LAX,1420564414,1302\n',
 'WYU2010YH8,JVY9791G,PVG,FCO,1420564561,1189\n']

wrong_format = ['BWI0520BG6,VYW5940P,LAS,SI|,1420565203,1843\n',
 'CKZ3132BR4,RUM0422W,MUC,;AD,1420563539,194\n',
 'CKZ313\\BR4,QHU1140O,CDG,LAS,1420564498,1133\n',
 'CXN7304ER2,GMO593[W,LHR,PEK,1420564317,1057\n',
 'CXN7304ER2,VDCP164W,FCO,LAS,1420564698,1276\n',
 'DAZ3029XA0,WPW9201U,DFW,yEK,1420564869,1452\n',
 'HGO4350KK1,QHU1140O,CDG,vAS,1420564498,1133\n',
 'JJM4724RF7,YZO4444S,BKK,MI^,1420565330,2027\n',
 'KKP5277HZ7,VYW5940P,LAS,:IN,1420565203,1843\n',
 'MXU9187YC7,MOO1786A,MAD,]RA,1420563408,184\n',
 'ONL0812DH1,BER7172M,KUL,[AS,1420565167,1848\n',
 'PAJ3974RK1,EWH6301Y,~AN,DFW,1420564967,1683\n',
 'POP2875LH3,MBw8071P,KUL,PEK,1420563856,572\n',
 'PUD8209OG3,SOH3431A,OR8,MIA,1420563649,250\n',
 'PUD8209OG3,XXQ4064%,JFK,FRA,1420563917,802\n',
 'SJD8775RZ4,4QU6245R,DEN,FRA,1420564460,1049\n',
 'SJD8775RZ4,HZT2506M,IAH,#MS,1420564324,1044\n',
 'SJD8775RZ4,WSK1289Z,CLT,vEN,1420563542,278\n',
 'SJD8|75RZ4,ULZ8130D,CAN,DFW,1420564983,1683\n',
 'SPR4484HA6,ATT7791R,AM%,DEN,1420564394,1001\n',
 'SPRb484HA6,VYW5940P,LAS,SIN,1420565203,1843\n',
 'UES915*GS5,SQU6245R,DEN,FRA,1420564460,1049\n',
 'WBE6935NU$,XOY7948U,ATL,LHR,1420564038,877\n',
 'WTC9125IE5,XIL3623J,PEK,L}X,1420564414,1302\n',
 'WYU2010YH8,XIL3623J,PEe,LAX,1420564414,1302\n',
 'WYu2010YH8,FYL5866L,ATL,HKG,1420565140,1751\n',
 'YMH6360YP0,ATT7791R,A;S,DEN,1420564394,1001\n']

def hamming_distance(s1, s2):
    return sum(c1 != c2 for c1, c2 in zip(s1, s2))

for r in correct_format:
    for i in wrong_format:
        if hamming_distance(r[0:10], i[0:10]) == 1:      
            corrected.append(r)
            wrong_format.remove(i)
        elif hamming_distance(r[11:19], i[11:19]) == 1:
            corrected.append(r)
            wrong_format.remove(i)
        elif hamming_distance(r[20:23], i[20:23]) == 1:
            corrected.append(r)
            wrong_format.remove(i)
        elif hamming_distance(r[24:27], i[24:27]) == 1:
            corrected.append(r)
            wrong_format.remove(i)


Итак, исправленный список, как ожидается, будет заполнен правильным форматом инеправильный формат должен быть пустым


corrected  = ['POP2875LH3,MBW8071P,KUL,PEK,1420563856,572\n',
 'UES9157GS5,SQU6245R,DEN,FRA,1420564460,1049\n',
 'CXN7304ER2,GMO5937W,LHR,PEK,1420564317,1057\n',
 'SJD8775RZ4,BQU6245R,DEN,FRA,1420564460,1049\n',
 'PUD8209OG3,XXQ4064X,JFK,FRA,1420563917,802\n',
 'SJD8775RZ4,ULZ8130D,CAN,DFW,1420564983,1683\n',
 'ONL0812DH1,BER7172M,KUL,LAS,1420565167,1848\n',
 'YMH6360YP0,ATT7791R,AMS,DEN,1420564394,1001\n',]

Однако, это то, что я получаю

corrected  = ['POP2875LH3,MBW8071P,KUL,PEK,1420563856,572\n',
 'UES9157GS5,SQU6245R,DEN,FRA,1420564460,1049\n',
 'UES9157GS5,SQU6245R,DEN,FRA,1420564460,1049\n',
 'CXN7304ER2,GMO5937W,LHR,PEK,1420564317,1057\n',
 'SJD8775RZ4,4QU6245R,DEN,FRA,1420564460,1049\n',
 'PUD8209OG3,XXQ4064X,JFK,FRA,1420563917,802\n',
 'ONL0812DH1,BER7172M,KUL,LAS,1420565167,1848\n',
 'YMH6360YP0,ATT7791R,AMS,DEN,1420564394,1001\n']

с этими небольшими выборочными данными. Я получаю дубликаты данных.но с большим я получаю дубликаты и неправильные результаты тоже.Любые мысли о причинах этой проблемы

Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 18 мая 2019

Некоторые изменения и предложения по коду

  • Вы хотите сравнить элемент с одинаковыми индексами для обоих массивов, но сейчас у вас есть 2 для циклов, которые сравнивают каждый элемент в обоих списках.
  • Вы можете избежать удаления данных из wrong_format.
  • Вы можете разделить обе строки на , вместо явных индексов, использовать генератор по индексам, чтобы сравнить оба элемента и добавить соответственно

Таким образом, обновленный код будет выглядеть как

corrected = []
correct_format = ['EZC9678QI6,VYW5940P,LAS,SIN,1420565203,1843\n',
 'EZC9678QI6,RUM0422W,MUC,MAD,1420563539,194\n',
 'CKZ3132BR4,XXQ4064B,JFK,FRA,1420563917,802\n',
 'HCA3158QA6,GMO5938W,LHR,PEK,1420564317,1057\n',
 'JBE2302VO4,VDC9164W,FCO,LAS,1420564698,1276\n',
 'XFG5747ZT9,PME8178S,DEN,PEK,1420564409,1322\n',
 'CDC0302NN5,QHU1140O,CDG,LAS,1420564498,1133\n',
 'CYJ0225CH1,YZO4444S,BKK,MIA,1420565330,2027\n',
 'PIT2755XC1,VYW5940P,LAS,SIN,1420565203,1843\n',
 'IEG9308EA5,SQU6245R,DEN,FRA,1420564460,1049\n',
 'LLZ3798PE3,ULZ8130D,CAN,DFW,1420564983,1683\n',
 'LLZ3798PE3,MBA8071P,KUL,PEK,1420563856,572\n',
 'PIT2755XC1,SOH3431A,ORD,MIA,1420563649,250\n',
 'XFG5747ZT9,XXQ4064B,JFK,FRA,1420563917,802\n',
 'HCA3158QA6,SQU6245R,DEN,FRA,1420564460,1049\n',
 'JBE2302VO4,HZT2506M,IAH,AMS,1420564324,1044\n',
 'VZY2993ME1,WSK1289Z,CLT,DEN,1420563542,278\n',
 'SJD8775RZ4,TMV7633W,UGK,DXB,1420563958,849\n',
 'EDV2089LK5,ATT7791R,AMS,DEN,1420564394,1001\n',
 'SPR4484HA6,VDC9164W,FCO,LAS,1420564698,1276\n',
 'UES9151GS5,DAU2617A,CGK,SFO,1420564986,1811\n',
 'WBE6935NU3,KJR6646J,IAH,BKK,1420565203,1928\n',
 'CDC0302NN5,XIL3623J,PEK,LAX,1420564414,1302\n',
 'WYU2010YH8,JVY9791G,PVG,FCO,1420564561,1189\n']

wrong_format = ['BWI0520BG6,VYW5940P,LAS,SI|,1420565203,1843\n',
 'CKZ3132BR4,RUM0422W,MUC,;AD,1420563539,194\n',
 'CKZ313\\BR4,QHU1140O,CDG,LAS,1420564498,1133\n',
 'CXN7304ER2,GMO593[W,LHR,PEK,1420564317,1057\n',
 'CXN7304ER2,VDCP164W,FCO,LAS,1420564698,1276\n',
 'DAZ3029XA0,WPW9201U,DFW,yEK,1420564869,1452\n',
 'HGO4350KK1,QHU1140O,CDG,vAS,1420564498,1133\n',
 'JJM4724RF7,YZO4444S,BKK,MI^,1420565330,2027\n',
 'KKP5277HZ7,VYW5940P,LAS,:IN,1420565203,1843\n',
 'MXU9187YC7,MOO1786A,MAD,]RA,1420563408,184\n',
 'ONL0812DH1,BER7172M,KUL,[AS,1420565167,1848\n',
 'PAJ3974RK1,EWH6301Y,~AN,DFW,1420564967,1683\n',
 'POP2875LH3,MBw8071P,KUL,PEK,1420563856,572\n',
 'PUD8209OG3,SOH3431A,OR8,MIA,1420563649,250\n',
 'PUD8209OG3,XXQ4064%,JFK,FRA,1420563917,802\n',
 'SJD8775RZ4,4QU6245R,DEN,FRA,1420564460,1049\n',
 'SJD8775RZ4,HZT2506M,IAH,#MS,1420564324,1044\n',
 'SJD8775RZ4,WSK1289Z,CLT,vEN,1420563542,278\n',
 'SJD8|75RZ4,ULZ8130D,CAN,DFW,1420564983,1683\n',
 'SPR4484HA6,ATT7791R,AM%,DEN,1420564394,1001\n',
 'SPRb484HA6,VYW5940P,LAS,SIN,1420565203,1843\n',
 'UES915*GS5,SQU6245R,DEN,FRA,1420564460,1049\n',
 'WBE6935NU$,XOY7948U,ATL,LHR,1420564038,877\n',
 'WTC9125IE5,XIL3623J,PEK,L}X,1420564414,1302\n',
 'WYU2010YH8,XIL3623J,PEe,LAX,1420564414,1302\n',
 'WYu2010YH8,FYL5866L,ATL,HKG,1420565140,1751\n',
 'YMH6360YP0,ATT7791R,A;S,DEN,1420564394,1001\n']

def hamming_distance(s1, s2):
    return sum(c1 != c2 for c1, c2 in zip(s1, s2))

#Iterate over both lists together
for r, i in zip(correct_format, wrong_format):

    #Split string into words by comma
    li_r = r.split(',')
    li_i = i.split(',')
    #Check all if conditions and append accordingly
    if any(hamming_distance(item_r, item_i) == 1 for item_r, item_i in zip(li_r,li_i)):
        corrected.append(r)

print(corrected)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...