Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表中位数的中间值_Python - Fatal编程技术网

Python 列表中位数的中间值

Python 列表中位数的中间值,python,Python,我需要一个向量来存储主列表“v”的中间值。我用下面的代码尝试了一些东西,但我只能用正确的方式编写一些值 v=[1,2,3,4,5,6,7,8,9,10] final=[] nfac=0 for j in range (0,4): nfac=j+1 for k in range (0,nfac): if k%2==0: final.append(v[10/2**(nfac)-1]) else: fina

我需要一个向量来存储主列表“v”的中间值。我用下面的代码尝试了一些东西,但我只能用正确的方式编写一些值

v=[1,2,3,4,5,6,7,8,9,10]
final=[]
nfac=0
for j in range (0,4):
    nfac=j+1
    for k in range (0,nfac):
        if k%2==0:
            final.append(v[10/2**(nfac)-1])
        else:
            final.append(v[9-10/2**(nfac)])
v=[1,2,3,4,5,6,7,8,9,10]中的第一个中位数是5

然后我需要剩余子列表[1,2,3,4]和[6,7,8,9,10]的中间值。即分别为2和8。等等

“最终”清单必须采用以下格式:


final=[5,2,8,1,3,6,9,4,7,10]

请注意,您定义的任务基本上等同于从数组构造

首先明确定义一个用于查找中间值的辅助函数:

def split_by_median(l):
    median_ind = (len(l)-1) // 2
    median = l[median_ind]
    left = l[:median_ind]
    right = l[median_ind+1:] if len(l) > 1 else []
    return median, left, right
按照您给出的示例,您希望以广度优先的方式处理生成的子列表,因此我们需要一个队列来记住以下任务:

from collections import deque   
def construct_heap(v):
    lists_to_process = deque([sorted(v)])
    nodes = []
    while lists_to_process:
        head = lists_to_process.popleft()
        if len(head) == 0:
            continue

        median, left, right = split_by_median(head)
        nodes.append(median)
        lists_to_process.append(left)
        lists_to_process.append(right)

    return nodes
最后调用函数:

print(construct_heap([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])) #  [5, 2, 8, 1, 3, 6, 9, 4, 7, 10]
print(construct_heap([5, 1, 2])) #  [2, 1, 5]
print(construct_heap([1, 0, 0.5, -1])) #  [0, -1, 0.5, 1] 
print(construct_heap([])) #  [] 

这里有一些误解。中位数是一组值的单个描述性值。所以你的向量v只有一个中位数,根据不同的定义,它可能是5,5.5或6。您建议的作为所需输出的内容似乎与快速排序有关,是这样吗?如果是这样的话,请更具体地说明您真正想要实现的目标。谢谢您的更新。尽管如此,我还不知道一个叫做第二中位数的概念,谷歌也没有给出任何合理的解释。您能告诉我们您使用的第n个中位数的定义吗?我想从列表中搜索中位数,对不起。根据标准定义(),每个数据样本只有一个中位数,因此“列表中的中位数”未定义:-(或者可能
v
碰巧是(其他一些数据的)中位数列表)?第一个中位数是从“v”列表中获得的。现在该列表分为两个较小的中位数。[1,2,3,4]和[6,7,8,9,10]现在计算第二个和第三个中间值