香农多样性计划:基本问题

时间:2018-06-18 17:54:04

标签: python indexing calculation

我是一名生物学学生,试图进入编程,并且我正在尝试为一个研究项目写一个基本的索引计算器。我需要一个程序,它将提示用户一次输入一个数据点,对每个数据点执行正确的计算(-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)

2 个答案:

答案 0 :(得分:2)

这里有很多问题。

  • 您需要直接获取变量。
    • 您尝试使用index来表示值列表和输入字符串。它不能同时意味着两件事。
    • 您尝试使用x而不在任何地方定义它。据推测它应该是输入字符串的浮点值?如果是这样,你必须这样说。
    • 您尝试在p存在之前使用entry来定义p。但目前尚不清楚entry对哪些内容有用,因为你永远不会使用它。
  • 您还需要直接控制流量。
    • else案例中应该运行什么代码?它必须包含return,或者您需要一些其他方法来摆脱循环。
  • 你还需要直截了当。 [input(…)]将为您提供一个包含一个元素的列表,即输入字符串。很难想象那会有什么用处。您无法将该列表与'done'进行比较,也不能将其转换为浮点数。你想要的只是输入字符串本身。
  • 你不能只猜测可能存在的功能。没有名为ln的函数。查看Built-in Functionsmath模块的文档,以及与查找所需功能相关的任何其他内容。
  • 1,000,000不是数字,而是三个数字的元组。
    • 您可以撰写1_000_0001000000
    • 但目前尚不清楚为什么首先需要限制。为什么不直接循环直到输入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.41O,它会告诉他们再试一次,而不是拯救整个事情。
  • 您实际上不需要构建列表,只需保持运行总计。
  • 如果颠倒if / else的意义,它可能会更具可读性。
  • 你实际上并没有计算香农多样性指数。这不是-x ln x的总和,而是-p ln p的总和,其中px / 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的新手。 这可能有助于您获取存储在列表中的值并计算它直到您键入完成。