Encuentre líneas que comienzan con la misma cadena y mantenga la última ocurrencia
-
22-10-2019 - |
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.
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