Python 列表较大时未从列表中删除的项目

Python 列表较大时未从列表中删除的项目,python,list,parsing,csv,Python,List,Parsing,Csv,我正在解析一个相当大的CSV文件。我只对其中两行感兴趣(标题为Ccy1和Ccy2的行) 到目前为止,我的方法是解析整个文件,任何不在“已批准”字段列表中的字段都会从列表中删除 我在一个只有3行的小样本文件上尝试了这个方法,效果很好。 当我解析包含107行的真实文件时,剩下的不仅仅是“approved”字段 为什么不删除列表中不包含的所有值 这是我当前的脚本: import csv data = csv.reader(open('real_sample.csv')) fields = data.n

我正在解析一个相当大的CSV文件。我只对其中两行感兴趣(标题为
Ccy1
Ccy2
的行)

到目前为止,我的方法是解析整个文件,任何不在“已批准”字段列表中的字段都会从列表中删除

我在一个只有3行的小样本文件上尝试了这个方法,效果很好。 当我解析包含107行的真实文件时,剩下的不仅仅是“approved”字段

为什么不删除列表中不包含的所有值

这是我当前的脚本:

import csv
data = csv.reader(open('real_sample.csv'))
fields = data.next()
ccy_fields = ['Ccy1', 'Ccy2']

print 'fields: ' + str(fields)
print 'fields to keep: ' + str(ccy_fields)

for item in fields:
    if str(item) not in ccy_fields:
         fields.remove(item)

print "fields: " + str(fields)

您需要获取列表的副本并首先对其进行迭代,否则迭代将失败,结果可能是意外的

for item in fields:
    if str(item) not in ccy_fields:
        fields.remove(item)    
#replace by
fields = [item for item in fields if str(item) in ccy_fields]

相关问题:

您需要先复制一份列表并对其进行迭代,否则迭代将失败,结果可能出乎意料

for item in fields:
    if str(item) not in ccy_fields:
        fields.remove(item)    
#replace by
fields = [item for item in fields if str(item) in ccy_fields]

相关问题:

您需要先复制一份列表并对其进行迭代,否则迭代将失败,结果可能出乎意料

for item in fields:
    if str(item) not in ccy_fields:
        fields.remove(item)    
#replace by
fields = [item for item in fields if str(item) in ccy_fields]

相关问题:

您需要先复制一份列表并对其进行迭代,否则迭代将失败,结果可能出乎意料

for item in fields:
    if str(item) not in ccy_fields:
        fields.remove(item)    
#replace by
fields = [item for item in fields if str(item) in ccy_fields]

相关问题:

您正在修改正在迭代的列表,方法是从循环体中的同一列表中删除项。这就是你问题的原因

我建议列表理解是更好的方法:

fields = [item for item in fields if item in ccy_fields]
此外,csv模块为每个字段返回字符串类型的数据,因此无需使用
str()
进行转换

从正在迭代的列表中删除项时,通常会看到删除项后面的项将被跳过。当您仅使用3列进行测试时,如果
ccy_字段中有2列,而其中一列没有,则可能会看到正确的结果。当扩展到100+个项目时,将跳过符合删除条件的字段

要解决此问题,需要确定要保留的列的索引,然后用于过滤掉其他列:

import csv
ccy_fields = ['Ccy1', 'Ccy2']

with open('real_sample.csv') as f:
    reader = csv.reader(f)
    headers = next(reader)
    indices = [i for i,field in enumerate(headers) if field in ccy_fields]
    data = [[row[i] for i in indices] for row in reader]

在此之后,
数据将包含所有行,其中只包含所需的列。

您正在通过删除循环体中相同列表中的项来修改正在迭代的列表。这就是你问题的原因

我建议列表理解是更好的方法:

fields = [item for item in fields if item in ccy_fields]
此外,csv模块为每个字段返回字符串类型的数据,因此无需使用
str()
进行转换

从正在迭代的列表中删除项时,通常会看到删除项后面的项将被跳过。当您仅使用3列进行测试时,如果
ccy_字段中有2列,而其中一列没有,则可能会看到正确的结果。当扩展到100+个项目时,将跳过符合删除条件的字段

要解决此问题,需要确定要保留的列的索引,然后用于过滤掉其他列:

import csv
ccy_fields = ['Ccy1', 'Ccy2']

with open('real_sample.csv') as f:
    reader = csv.reader(f)
    headers = next(reader)
    indices = [i for i,field in enumerate(headers) if field in ccy_fields]
    data = [[row[i] for i in indices] for row in reader]

在此之后,
数据将包含所有行,其中只包含所需的列。

您正在通过删除循环体中相同列表中的项来修改正在迭代的列表。这就是你问题的原因

我建议列表理解是更好的方法:

fields = [item for item in fields if item in ccy_fields]
此外,csv模块为每个字段返回字符串类型的数据,因此无需使用
str()
进行转换

从正在迭代的列表中删除项时,通常会看到删除项后面的项将被跳过。当您仅使用3列进行测试时,如果
ccy_字段中有2列,而其中一列没有,则可能会看到正确的结果。当扩展到100+个项目时,将跳过符合删除条件的字段

要解决此问题,需要确定要保留的列的索引,然后用于过滤掉其他列:

import csv
ccy_fields = ['Ccy1', 'Ccy2']

with open('real_sample.csv') as f:
    reader = csv.reader(f)
    headers = next(reader)
    indices = [i for i,field in enumerate(headers) if field in ccy_fields]
    data = [[row[i] for i in indices] for row in reader]

在此之后,
数据将包含所有行,其中只包含所需的列。

您正在通过删除循环体中相同列表中的项来修改正在迭代的列表。这就是你问题的原因

我建议列表理解是更好的方法:

fields = [item for item in fields if item in ccy_fields]
此外,csv模块为每个字段返回字符串类型的数据,因此无需使用
str()
进行转换

从正在迭代的列表中删除项时,通常会看到删除项后面的项将被跳过。当您仅使用3列进行测试时,如果
ccy_字段中有2列,而其中一列没有,则可能会看到正确的结果。当扩展到100+个项目时,将跳过符合删除条件的字段

要解决此问题,需要确定要保留的列的索引,然后用于过滤掉其他列:

import csv
ccy_fields = ['Ccy1', 'Ccy2']

with open('real_sample.csv') as f:
    reader = csv.reader(f)
    headers = next(reader)
    indices = [i for i,field in enumerate(headers) if field in ccy_fields]
    data = [[row[i] for i in indices] for row in reader]

在此之后,<代码>数据< /代码>将包含所有只有所需列的行。

您可能需要考虑在读取文件时直接取要的字段,而不是获取所有数据,然后修剪它。例如:

import csv
data   = csv.reader(open('real_sample.csv'))
wanted = []

for line in data:  # loop over the data without reading all of it into memory
    if ('Ccy1' in line or'Ccy2' in line):
        wanted.append(line)  # just keep the data when it matches you criteria

您可能想考虑在读取文件时直接占用您想要的字段,而不是获取所有数据,然后修剪它。例如:

import csv
data   = csv.reader(open('real_sample.csv'))
wanted = []

for line in data:  # loop over the data without reading all of it into memory
    if ('Ccy1' in line or'Ccy2' in line):
        wanted.append(line)  # just keep the data when it matches you criteria

您可能想考虑在读取文件时直接占用您想要的字段,而不是获取所有数据,然后修剪它。例如:

import csv
data   = csv.reader(open('real_sample.csv'))
wanted = []

for line in data:  # loop over the data without reading all of it into memory
    if ('Ccy1' in line or'Ccy2' in line):
        wanted.append(line)  # just keep the data when it matches you criteria

您可能想考虑在读取文件时直接占用您想要的字段,而不是获取所有数据,然后修剪它。例如:

import csv
data   = csv.reader(open('real_sample.csv'))
wanted = []

for line in data:  # loop over the data without reading all of it into memory
    if ('Ccy1' in line or'Ccy2' in line):
        wanted.append(line)  # just keep the data when it matches you criteria

首先,for循环中的缩进处于关闭状态。不确定是否