Pregunta

Tengo estos datos:

E 71484666NC 1201011060240260 387802-1227810  1022    25   0   5   2   313D 0 1G5
E 71484666NC 1201011060240263 387902-1227910  1300    10   0   2   1   300D 0 1A5
E 10115693AK 1201011060617450 658160-1517007   021 10  0 896  71   4   131L 2 AA2
E 10310002PR 0201011060102315 191509 -664820 39726  5  5 935  50  46 21282D 5 0hn

Necesito encontrar líneas que comienzan con los mismos primeros 12 caracteres. Si hay múltiplos, necesito eliminar ocurrencias anteriores y solo mantener el último. Entonces debería ser así:

E 71484666NC 1201011060240263 387902-1227910  1300    10   0   2   1   300D 0 1A5
E 10115693AK 1201011060617450 658160-1517007   021 10  0 896  71   4   131L 2 AA2
E 10310002PR 0201011060102315 191509 -664820 39726  5  5 935  50  46 21282D 5 0hn

Nota: En la mayoría de los casos, los caracteres después de los primeros 12 no coinciden ... por lo que verificar las líneas duplicadas no es una opción.

Nota: Necesita preservar el orden.

¿Fue útil?

Solución

from collections import OrderedDict

lines = OrderedDict()
for line in file:
    lines[line[0:12]] = line

Esto preservará el orden de las líneas mientras elimina los duplicados.

Editar: Esta versión de ordeneddict Trabaja en Python 2.4, 2.5 y 2.6.

Otros consejos

from collections import OrderedDict

mydata = """E 71484666NC 1201011060240260 387802-1227810  1022    25   0   5   2   313D 0 1G5
E 71484666NC 1201011060240263 387902-1227910  1300    10   0   2   1   300D 0 1A5
E 10115693AK 1201011060617450 658160-1517007   021 10  0 896  71   4   131L 2 AA2
E 10310002PR 0201011060102315 191509 -664820 39726  5  5 935  50  46 21282D 5 0hn"""

datalines = mydata.split('\n')
uniques = OrderedDict((x[:12],x[12:]) for x in datalines)
final = [x+y for x,y in uniques.items()]

for x in final:
  print x

Esto produce:

E 71484666NC 1201011060240263 387902-1227910  1300    10   0   2   1   300D 0 1A5
E 10115693AK 1201011060617450 658160-1517007   021 10  0 896  71   4   131L 2 AA2
E 10310002PR 0201011060102315 191509 -664820 39726  5  5 935  50  46 21282D 5 0hn

Use un diccionario, tomando los primeros 12 caracteres como clave:

mydict = {}
for line in file:
    key = line[:12]
    value = line
    mydict[key] = line

Esto anula automáticamente todas las entradas anteriores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top