Python 列表较大时未从列表中删除的项目
我正在解析一个相当大的CSV文件。我只对其中两行感兴趣(标题为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
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循环中的缩进处于关闭状态。不确定是否