Python迭代列表列表中列的元素

时间:2015-01-07 12:09:08

标签: python list for-loop

嗨所有新的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列表

任何建议都非常感谢

2 个答案:

答案 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)