Estoy tratando de usar un bucle anidado para eliminar ciertas líneas de un archivo .tsv que tengo. Las líneas que quiero eliminar comienzan con MD # y estoy tratando de iterar el número usando un ciclo while.

La primera vez que se usa el número 'MD1', se eliminan las 10 líneas que lo contienen como la primera cadena de la línea; sin embargo, después MD2, MD3, etc., no.

Como todavía estoy un poco oxidado con Python, configuré una declaración if muy cruda para eliminar las líneas, esto funcionó aunque no es el código más bonito del mundo.

Se incluye un ejemplo de cómo se ven los datos, 4 columnas de ancho, 320 filas

[['MD1', 'Liverpool', 'Draw', 'Norwich'],
 ['Google', '0.85', '0.10', '0.05'],
 ['Bookies', '0.14', '7.00', '25.00'],
 ['Outcome', '11.43', '80.00', '260.00'],
 ['MD1', 'West Ham', 'Draw', 'Man. City'],
 ['Google', '0.09', '0.17', '0.74'],
 ['Bookies', '12.00', '5.00', '0.25'],
 ['Outcome', '130.00', '60.00', '12.50'],
 ['MD1', 'Crystal Palace', 'Draw', 'Everton'],
 ['Google', '0.30', '0.30', '0.40'],
 ['Bookies', '2.10', '2.20', '1.38'],
 ['Outcome', '31.00', '32.00', '23.75'],
 ['MD1', 'Burnley', 'Draw', 'Southhampton'],
 ['Google', '0.35', '0.31', '0.34'],
 ['Bookies', '1.63', '2.20', '1.75'],
 ['Outcome', '26.25', '32.00', '27.50'],
import csv
import numpy as np

data_list = []
with open('Sheet7.tsv',newline = '') as data:
    data_reader = csv.reader(data, delimiter = '\t')
    for data in data_reader:
        data_list.append((data))
datamod = np.array([])
datamod = data_list

games = 8
i = 0
g = 1

while g <= games:
    MDg = ('MD'+str(g))
    g +=1
    while i < len(datamod):

        if datamod[i][0] == MDg:
            datamod = np.delete(datamod, i, axis = 0)
            i +=1

        else:
            i +=1

Código alternativo utilizado

while i < len(datamod):
    if datamod[i][0] == 'MD1':
        datamod = np.delete(datamod, i, axis = 0)
    if datamod[i][0] == 'MD2':
        datamod = np.delete(datamod, i, axis = 0)
    if datamod[i][0] == 'MD3':
        datamod = np.delete(datamod, i, axis = 0)
    if datamod[i][0] == 'MD4':
        datamod = np.delete(datamod, i, axis = 0)
    if datamod[i][0] == 'MD5':
        datamod = np.delete(datamod, i, axis = 0)
    if datamod[i][0] == 'MD6':
        datamod = np.delete(datamod, i, axis = 0)
    if datamod[i][0] == 'MD7':
        datamod = np.delete(datamod, i, axis = 0)
    if datamod[i][0] == 'MD8':
        datamod = np.delete(datamod, i, axis = 0)
    i += 1

Así que esperaría que el resultado no tuviera cada 4ta línea y, por lo tanto, fuera una lista con 240 filas en lugar de las 320 originales

Si alguien pudiera ayudarme con esto sería muy apreciado :)

0
Ethan Day 10 oct. 2019 a las 00:20

3 respuestas

La mejor respuesta

Parece que un problema es que la variable i no se restablece a 0 después de una iteración completa del bucle externo while. Debe restablecer el valor i en el bucle externo.

Mejor aún, considere cambiar los dos while bucles a for bucles utilizando la construcción for i in range(length): de iteración.

¡Espero que esto ayude!

https://www.geeksforgeeks.org/python-range-function/

1
iiKop47 9 oct. 2019 a las 21:29

Hay demasiada replicación y puede generalizarse aún más. Si no necesita el dígito final después de MD para cualquier comparación, simplemente omita las líneas que se ven así de inmediato.

El siguiente código carga todos los datos en una lista y al mismo tiempo verifica si el primer campo de datos coincide con ^MD\d+$, lo que significa que comienza con MD seguido de uno o más dígitos sin ningún carácter final adicional :

import csv
import re

with open('Sheet7.tsv', newline='') as infile:
    reader = csv.reader(infile, delimiter='\t')
    data = [
        line for line in reader
        if not re.match('^MD\d+$', line[0].strip())
    ]

Su lista resultante se almacena en la variable data y debe estar lista para más cálculos.

2
jbndlr 9 oct. 2019 a las 21:36

Si yo fuera tú, haría algo así

data_list = []
with open('Sheet7.tsv') as f:
    for line in f:
        cols = line.split('\t')
        if cols[0].startswith('MD') and cols[0][2:].isdigit():
            data_list.append(cols)
0
SpghttCd 9 oct. 2019 a las 22:00
58312474