-1

我需要创建一个函数 q1 来计算名为:lst 的列表的第一个四分位数。我不允许使用任何进口产品!当我运行我的函数时,答案不正确。我能改变什么?

def q1(lst):
    lst.sort()

    middle = len(lst)//2

    k1 = median([middle])
    return k1

这是我的中值函数:

def median(lst):
    lst.sort()
    half_list = len(lst) // 2
    even = lst[half_list]
    odd = lst[-half_list-1]
    return (even + odd) / 2
4

3 回答 3

1

中位数是排序列表的中间项,即len(lst)//2。因此,列表的第一个和第三个四分位数是多少?

firstQIndex = len(lst)//4
thirdQIndex = (3*len(lst))//4
firstQ = lst[firstQIndex]
thirdQ = lst[thirdQIndex]
于 2020-11-12T09:58:15.407 回答
1

您可以尝试此功能(独立,无导入):

def quantile(x, y):
    n = int(round(y * len(x) + 0.5))
    return x[n-1]

并调用:

print(quantile(myList, 0.1))
print(quantile(myList, 0.3))
于 2020-11-12T09:58:32.780 回答
0

如果需要,实现了一个简单的分位数函数,该函数使用线性插值来获取两个索引之间的值。

def calc_quantile(lst, q):
    s_lst = sorted(lst)

    idx = (len(s_lst) - 1)*q
    int_idx = int(idx)
    remainder = idx % 1
    if remainder > 0:
        lower_val = s_lst[int_idx]
        upper_val = s_lst[int_idx + 1]

        return lower_val * (1 - remainder) + upper_val * remainder
    else:
        return s_lst[int_idx]

使用以下扩展代码编辑了我的回复,以匹配您的测试用例:

def calc_quantile(lst, q, method='linear'):
    if not lst:
        return ValueError("list is empty, cannot calculate quantile")
    if not 0 <= q <= 1:
        return ValueError("q must be in the domain 0 to 1")
    if method not in ['linear', 'left-side', 'average']:
        return NotImplementedError("the chosen method has not been implemented")

    s_lst = sorted(lst)

    idx = (len(s_lst) - 1)*q
    int_idx = int(idx)
    remainder = idx % 1
    if remainder > 0 and method != 'left-side':
        lower_val = s_lst[int_idx]
        upper_val = s_lst[int_idx + 1]

        if method == 'linear':
            return lower_val * (1 - remainder) + upper_val * remainder
        else:
            return (lower_val + upper_val) / 2
    else:
        return s_lst[int_idx]


print(calc_quantile([1, 3, 4, 6, 4, 2], 0.25, 'left-side'))   # 2
print(calc_quantile([1, 3, 5, 6, 1, 4, 2], 0.25, 'left-side'))  # 1
print(calc_quantile([1, 3, 3, 5, 6, 2, 4, 1], 0.25, 'average'))  # 1.5
于 2020-11-12T10:19:21.870 回答