首页 > 解决方案 > 第一个 while 循环迭代,但不改变第二个循环内的值

问题描述

我正在尝试使用嵌套循环从我拥有的 .tsv 文件中删除某些行。我要删除的所有行都以 MD# 开头,我正在尝试使用 while 循环来迭代数字。

第一次使用数字“MD1”时,包含该数字的所有 10 行作为该行的第一个字符串都将被删除,但之后 MD2、MD3 等则不会。

由于我对 Python 仍然有些生疏,我设置了一个非常粗略的 if 语句来删除这些行,尽管它不是世界上最漂亮的代码,但它仍然有效。

包括的是数据外观的示例,4 列宽,320 行

[['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

使用的替代代码

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

所以我希望结果不是每 4 行都有,因此是一个包含 240 行而不是原来的 320 行的列表

如果有人可以帮助我,将不胜感激:)

标签: python

解决方案


复制太多,可以进一步推广。如果您不需要后面的数字MD进行任何比较,只需立即省略看起来像这样的行。

以下代码将所有数据加载到列表中,同时检查第一个数据字段是否匹配^MD\d+$,这意味着以一个或多个数字开头,MD没有任何额外的尾随字符

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

然后,您的结果列表将存储在data变量中,并应准备好进行进一步计算。


推荐阅读