我是一名生物学学生,试图进入编程,并且我正在尝试为一个研究项目写一个基本的索引计算器。我需要一个程序,它将提示用户一次输入一个数据点,对每个数据点执行正确的计算(-1*(x*ln(x))
),并将新的计算值输入到数组中。一旦用户输入'done'
,我希望程序对数组值求和并返回该索引值。
这就是我所拥有的。我很新,所以对任何明显的错误道歉。任何正确方向的点都非常感激。
import math
print('This program calculates a Shannon Diversity '
'Index value for a set of data points entered by the user.'
' when prompted enter a species number value,then press enter. '
'COntinue until all data points have been entered. '
'Upon completion, enter the word done.')
def Shannonindex():
index = []
entries = 1,000,000
endKey = 'done'
for i in range(entries):
index = [input("Enter a value: ")]
if index != endKey:
entry = p
p = -1*(x*ln(x))
index.append(p)
else Sindex = sum(index)
return Sindex
print('Your Shannon Diversity Value is: ", Sindex)
答案 0 :(得分:2)
这里有很多问题。
index
来表示值列表和输入字符串。它不能同时意味着两件事。x
而不在任何地方定义它。据推测它应该是输入字符串的浮点值?如果是这样,你必须这样说。p
存在之前使用entry
来定义p
。但目前尚不清楚entry
对哪些内容有用,因为你永远不会使用它。else
案例中应该运行什么代码?它必须包含return
,或者您需要一些其他方法来摆脱循环。[input(…)]
将为您提供一个包含一个元素的列表,即输入字符串。很难想象那会有什么用处。您无法将该列表与'done'
进行比较,也不能将其转换为浮点数。你想要的只是输入字符串本身。ln
的函数。查看Built-in Functions,math
模块的文档,以及与查找所需功能相关的任何其他内容。1,000,000
不是数字,而是三个数字的元组。
1_000_000
或1000000
。done
?所以,让我们解决这些问题:
import math
def Shannonindex():
index = []
endKey = 'done'
while True:
value = input("Enter a value: ")
if value != endKey:
x = float(value)
p = -1 * (x * math.log(x))
index.append(p)
else:
Sindex = sum(index)
return Sindex
Sindex = Shannonindex()
print('Your Shannon Diversity Value is: ", Sindex)
还有很多方法可以改善这一点:
13.2.4
或1O
,它会告诉他们再试一次,而不是拯救整个事情。if
/ else
的意义,它可能会更具可读性。-x ln x
的总和,而是-p ln p
的总和,其中p
是x / sum(all x)
的比例。要处理这个问题,您需要将所有原始x
值保留在列表中,以便将其转换为p
值列表,以便对这些值进行求和。答案 1 :(得分:0)
import math
index = []
for i in range(1,100000):
val = input("Enter a value: ")
if val =='done':
break
else:
x = int(val)
p = -1*(x*math.log(x))
index.append(p)
print ("The value of index is %s:"%index)
=============================================== ==
这是代码的简化形式,因为你是python的新手。 这可能有助于您获取存储在列表中的值并计算它直到您键入完成。