嗨所有新的python更习惯于像软件这样的矩阵
我在迭代列表列表时遇到问题。
我已将csv文件导入为列表
['2004', '1', '7', '20', '50', '0', '8.92', '7.63', '9.84', '0.34', '2'],
['2004', '1', '7', '21', '0', '0', '9.4', '8.69', '10.04', '0.27', '2'],
['2004', '1', '7', '21', '10', '0', '9.14', '8.02', '9.75', '0.29', '2'],
['2004', '1', '7', '21', '20', '0', '9.12', '8.11', '9.75', '0.14', '2'],
['2004', '1', '7', '21', '30', '0', '9.09', '8.59', '9.75', '0.17', '2'],
['2004', '1', '7', '21', '40', '0', '8.85', '8.11', '9.56', '0.16', '2'],
['2004', '1', '7', '21', '50', '0', '8.86', '8.11', '9.46', '0.24', '2'],
['2004', '1', '7', '22', '0', '0', '8.72', '7.92', '9.36', '0.23', '2'],
['2004', '1', '7', '22', '10', '0', '9.01', '7.73', '10.23', '0.35', '2'],
['2004', '1', '7', '22', '20', '0', '9.45', '8.4', '10.42', '0.37', '2'],
['2004', '1', '7', '22', '30', '0', '9.14', '8.4', '10.13', '0.34', '2'],
['2004', '1', '7', '22', '40', '0', '9.04', '8.5', '9.94', '0.25', '2'],
...]
每一行都是一个元素列表
我需要使用第4列(col 3开始计数为0)从文件中提取(过滤)数据行作为标准,即如果第4列中的任何元素大于3且小于5将该行写入一个新的列表,如果任何第4列元素大于17且小于19,也将此行写入相同的新列表。
import csv
data = open('imput.csv', 'r')
datareader = csv.reader(data)
dataIn = []
for row in datareader:
dataIn.append(row) # reading in the data as a list of lists
dataFlt = []; #initialise new lists
data_vals = [];
for i in range(0,len(dataIn)):
if dataIn[i][3] >= 3.0 and dataIn[i][3] <= 5.0:
dataFlt.append(i)
elif dataIn[i][3] >= 17.0 and dataIn[i][3] <=19.0:
dataFlt.append(i)
此代码运行时没有错误,但返回一个空的dataFlt列表
任何建议都非常感谢
答案 0 :(得分:1)
您需要先将字符串从字符串转换为float:
column = float(dataIn[i][3])
if 3.0 <= column <= 5.0 or 17.0 <= column <= 19.0:
dataFlt.append(dataIn[i])
我使用比较链来简化测试,我将行而不是索引添加到dataFlt
。
您的代码可以简化为在阅读时过滤:
with open('imput.csv', 'r') as data:
datareader = csv.reader(data)
dataFlt = [row for row in datareader
if 3.0 <= float(row[3]) <= 5.0 or 17.0 <= float(row[3]) <= 19.0]
这会在一个步骤中生成dataFlt
列表,并且根本不会构建dataIn
列表。如果您确实需要dataIn
列表用于其他目的,只需在CSV阅读器上拨打list()
:
with open('imput.csv', 'r') as data:
datareader = csv.reader(data)
dataIn = list(datareader)
dataFlt = [row for row in dataIn
if 3.0 <= float(row[3]) <= 5.0 or 17.0 <= float(row[3]) <= 19.0]
答案 1 :(得分:0)
您正在将字符串与浮点数进行比较,您需要转换为浮点数:
for row in datareader: # just iterate over the datareader
if 3.0 <= float(row[3]) <= 5.0:
dataFlt.append(row)
elif 17.0 <= float(row[3]) <= 19.0:
dataFlt.append(row)
或者:
if 3.0 <= float(row[3]) <= 5.0 or 17.0 <= float(row[3]) <= 19.0:
dataFlt.append(row)
您也可以使用过滤器来保留所需的行:
filter(lambda x: 3.0 <= float(x[3]) <= 5.0 or 17.0 <= float(x[3]) <= 19.0 , datareader)