首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环中的条件语句

循环中的条件语句
EN

Stack Overflow用户
提问于 2016-10-27 13:42:56
回答 2查看 183关注 0票数 0

我有一个csv文件,它有5列13行,如下所示:

现场试验长宽高

代码语言:javascript
运行
复制
1   1   2.2 1.3 9.6
1   2   2.1 2.2 7.6
1   3   2.7 1.5 2.2
2   1   3   4.5 1.5
2   2   3.1 3.1 4
2   3   2.5 2.8 3
3   1   1.9 1.8 4.5
3   2   1.1 0.5 2.3
3   3   3.5 2   7.5
4   1   2.9 2.7 3.2
4   2   4.5 4.8 6.5
4   3   1.2 1.8 2.7

长/宽/高是植物的长度/宽度/高度。

对于数据集中的每一行,我想要创建一个条件代码,以查看植物是高(高> 5)、中等(2 <=高< 5)还是短(高< 2),然后确定每个植物的碳总量。

植物总碳= 1.8 +2*原木(体积),其中volume=length x宽度x高度。

然后,我想将这些信息作为表存储在嵌套列表中,其中第一列有实验编号,第二列包含字符串“高”、“中等”或“短”(取决于植物的高度),第三列包含植物的碳含量。

到目前为止,这是我的代码:

代码语言:javascript
运行
复制
from __future__ import division
import math
import numpy
shrub_exp=numpy.loadtxt("/Users/louisestevens/Downloads/shrub_volume_experiment.csv",dtype=float,delimiter=',',skiprows=1,usecols=(2,3,4))
for rows in shrub_exp:
    print(rows)

height=(shrub_exp,4)
def height_test(height):
    if height > 5:
        return 'Tall'
    elif 2 <= height < 5:
        return 'Medium'
    else:
        return 'Short'
for x in height:
    print(height_test(x))

for x,y,z in shrub_exp:
    volume=(x*y*z)
    total_carbon=1.8 + 2 * math.log(volume)
    print(total_carbon)

我不确定是否正确选择了“高度”列--这是最后一列--以及如何将这些信息存储在嵌套列表中。

请给我一些关于如何简洁有效地写这个脚本的建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-27 15:17:18

不求助于numpy,下面的代码是获得结果的一种方法。假设csv文件在本地目录中称为shrub.csv,如下所示:

代码语言:javascript
运行
复制
1,1,2.2,1.3,9.6
1,2,2.1,2.2,7.6
1,3,2.7,1.5,2.2
2,1,3,4.5,1.5
2,2,3.1,3.1,4
2,3,2.5,2.8,3
3,1,1.9,1.8,4.5
3,2,1.1,0.5,2.3
3,3,3.5,2,7.5
4,1,2.9,2.7,3.2
4,2,4.5,4.8,6.5
4,3,1.2,1.8,2.7

import math
f=open('shrub.csv')
shrub_exp=f.readlines()
f.close()

def height_test(height):
    if height > 5:
        return 'Tall'
    elif height >= 2:
        return 'Medium'
    else:
        return 'Short'
res=[]
for row in shrub_exp:
    site,exp,leng,wid,hgt = row.split(',')
    volume=(float(leng)*float(wid)*float(hgt))
    total_carbon=1.8 + 2 * math.log(volume)
    res.append([exp, height_test(float(hgt)), total_carbon])
for r in res:
    print r

注意,对数据没有错误检查。

代码语言:javascript
运行
复制
['1', 'Tall', 8.425169446611104]
['2', 'Tall', 8.917085904771866]
['3', 'Medium', 6.174348482965436]
['1', 'Short', 7.8163095871050965]
['2', 'Medium', 9.098197168204184]
['3', 'Medium', 7.889044875446846]
['1', 'Medium', 7.267435895701576]
['2', 'Medium', 2.270144244358967]
['3', 'Tall', 9.721626339195156]
['1', 'Medium', 8.242226639616785]
['2', 'Tall', 11.688990983183421]
['3', 'Medium', 5.326719989412714]
票数 0
EN

Stack Overflow用户

发布于 2016-10-27 14:08:09

shhrub_exp是一个列表列表,其中每个列表都是CSV的一行。线

代码语言:javascript
运行
复制
height=(shrub_exp,4)

创建一个包含两个元素的新元组,第一个元素是shrub_exp,第二个元素是数字4。这对你一点好处都没有。

如果要处理每一行的高度;

代码语言:javascript
运行
复制
for row in shrub_exp:
    print( height_test(row[2]) )

为什么是2?因为在加载文件时跳过了列0和1。因此,文件中的第4列现在是行数据列表中的第2列。

最后一个for循环将每一行解压到x,y,z中。那么z就是高度。要在类似的列表中捕获输出,可以这样做;

代码语言:javascript
运行
复制
results = [] # start with empty list
for length,width,height in shrub_exp:
    volume=(length*width*height)
    total_carbon=1.8 + 2 * math.log(volume)
    results.append( [height_test(height) , volume, total_carbon] )  # add new row to the result
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40286180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档