Python 遍历列表列表中列的元素

Python iterating over elements of a column in a list of lists

大家好 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 列(第 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)

这段代码运行没有错误,但是returns一个空的dataFlt列表

非常感谢任何建议

您正在将字符串与浮点数进行比较,您需要转换为浮点数:

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)

您需要先将您的列从字符串转换为浮点数:

column = float(dataIn[i][3])
if 3.0 <= column <= 5.0 or 17.0 <= column <= 19.0:
    dataFlt.append(dataIn[i])

我使用比较链来简化您的测试,并且我将 而不是索引添加到 dataFlt.

您的代码可以简化为过滤 while reading:

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 reader:

上调用 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]