import math


def shannon_index(data: list):
    """考虑了variety/balance，Shamono & Weaver（1962）。

    Shannon指数是生态文献中比较流行的多样性指数，
    也叫Shannon Diversity Index、Shannon-Wiener指数、Shannon-Weaver指数和Shannon Entropy。

    Args:
        data(list): 列表中存放不同（物种）分类的出现次数

    Returns:
        float: Shannon Diversity Index
    """

    def p(n, N):
        """
        计算相对丰富度

        Args:
            n(int): 每个物种（分类）的数目
            N(int): 所有物种（分类）的总数

        Returns:
            float: 相对丰度值
        """
        if N == 0:
            ratio = 0
        else:
            ratio = float(n) / N
        return ratio * math.log(ratio) if ratio != 0 else 0

    N = sum(data)
    return -sum(p(n, N) for n in data)