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]
大家好 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]