Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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_Algorithm_Rendering - Fatal编程技术网

Python 返回数据渲染的重新排序范围的算法

Python 返回数据渲染的重新排序范围的算法,python,algorithm,rendering,Python,Algorithm,Rendering,以下是一些例子: given: 1,2,3 [list or range of numbers] return: 2,1,3 [reordered list] given: 1,2,3,4,5 return: 3 1 5 2 4 given: 1,2,3,4,5,6,7 return: 4 1 7 2 6 3 5 OR 4 7 1 5 3 2 6 or similar given: 1,2,4,5,6,7,8,9 return: 5,1,9,3,7,2,8,4,6 or simil

以下是一些例子:

given: 1,2,3   [list or range of numbers]
return: 2,1,3  [reordered list]

given: 1,2,3,4,5
return: 3 1 5 2 4 

given: 1,2,3,4,5,6,7
return: 4 1 7 2 6 3 5 OR 4 7 1 5 3 2 6 or similar

given: 1,2,4,5,6,7,8,9
return: 5,1,9,3,7,2,8,4,6 or similar
在渲染中,从中心开始,然后是最极端的情况,并变得越来越详细。这不是随机的。我是python的,但在comp-sci中必须有这个名字。谢谢你的帮助

编辑以添加 即使是—

given: 1234 
return: 2,1,4,3 OR 3,1,4,2 OR 2,4,1,3 OR 3,4,1,2
这应该做到:

def extreme_cases(upd_itrr, new_itrr):
    new_itrr.append(min(upd_itrr))
    new_itrr.append(max(upd_itrr))
    upd_itrr.remove(min(upd_itrr))
    upd_itrr.remove(max(upd_itrr))
    if len(upd_itrr) >= 2:
        extreme_cases(upd_itrr, new_itrr)
    return upd_itrr, new_itrr


def reordered_range(itr):
    new_itr = []
    center = 0
    if len(itr) % 2 != 0:
        center = itr[len(itr) // 2]
    elif len(itr) % 2 == 0:
        center = itr[(len(itr) // 2) - 1]
    new_itr.append(center)
    upd_itr = itr[:]
    upd_itr.remove(center)
    upd_itr, new_itr = extreme_cases(upd_itr, new_itr)
    if upd_itr:
        new_itr.append(upd_itr[0])
    return new_itr


print(reordered_range([1, 2, 3]))
print(reordered_range([1, 2, 3, 4]))
print(reordered_range([1, 2, 3, 4, 5]))
print(reordered_range([1, 2, 3, 4, 5, 6, 7]))
print(reordered_range([1, 2, 4, 5, 6, 7, 8, 9]))
输出:

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

一个有效的,但不公平的解决方案:

def sigorder(lst):
    result = []
    l = len(lst)
    if l <= 2:
        return lst
    if l > 2:
        result.append(lst[l/2])
        result.append(lst[0])
        result.append(lst[-1])
        right = sigord(lst[l/2+1:-1])
        left = sigord(lst[1:l/2])
        result.extend(slicezip(left, right))

    return result
长度为4-9的列表的输出:

[3, 1, 4, 2]
[3, 1, 5, 2, 4]
[4, 1, 6, 2, 5, 3]
[4, 1, 7, 2, 5, 3, 6]
[5, 1, 8, 3, 6, 2, 7, 4]
[5, 1, 9, 3, 7, 2, 6, 4, 8]
另一个解决方案:

import numpy as np
from copy import copy

def bisecting_order(lst):

    # bisecting order of an unordered list
    result = []
    l = len(lst)
    if l < 3:
        return lst
    result.append(closest(lst,np.mean(lst)))
    result.append(min(lst))
    result.append(max(lst))

    # get bisections
    while len(result)!=len(lst):
        temp_list = copy(result)
        temp_list.sort()
        for i in xrange(len(temp_list)-1):
            newnum = closest(lst,np.mean([temp_list[i],temp_list[i+1]]))
            if newnum in result:
                continue
            else:
                result.append(newnum)
    return result

def closest(mylist,mynum):
    return min(mylist, key=lambda x:abs(x-mynum))
将numpy导入为np
从副本导入副本
def平分顺序(lst):
#无序列表的对分顺序
结果=[]
l=len(lst)
如果l<3:
返回lst
结果.追加(最接近(lst,np.平均值(lst)))
结果追加(最小值(lst))
结果追加(最大值(lst))
#得到二等分
而蓝(结果)=len(lst):
临时列表=复制(结果)
临时列表排序()
对于X范围内的i(透镜(温度列表)-1):
newnum=最近(第一次,np.平均值([temp_list[i],temp_list[i+1]]))
如果结果为newnum:
持续
其他:
result.append(newnum)
返回结果
def最近值(mylist,mynum):
返回最小值(mylist,key=lambda x:abs(x-mynum))

在极端情况下,它是否从边界到中间工作?我认为您必须指定更多的预期行为,因为对于这个问题,每个用户可以/不能根据自己的喜好接受不同的可能解决方案。(基于观点的答案通常不被接受)。在最初的极端案例之后,他发布的例子中似乎使用了“最初案例之后的下一个极端案例”。例如,在第三个例子中,4是中心,1和7是初始的最小值和最大值,然后是2和6,然后是3和5。当有偶数个输入时会发生什么?偶数情况下给出:1234-2,1,4,3或3,1,4,2或2,4,1,3或3,4,1,2,你想让它给你中间,结束,然后对分其余的值?对我来说,这听起来像是一个递归函数。所以这是正确的,但我想你明白为什么这不是我想要的。“递归二分法”这个术语听起来很贴切,但我还是很好奇是否有工具可以做到这一点?也许写它只是最简单的方法哈哈。你的代码从中心开始,然后是极端,从极端到中心。我感兴趣的是中间,然后是极端,然后平分所有间隙,直到使用了原始列表中的所有术语。这仍然很接近。我认为你打印的最后两个区域在第三个学期后没有正确地对分。我自己尝试一下,你能澄清一下你到底在寻找什么吗?您发布的第四个示例(1,2,4,5,6,7,8,9)正确吗?它返回5,1,9,3,7,2,8,4,6?这就是它!
[3, 1, 4, 2]
[3, 1, 5, 2, 4]
[4, 1, 6, 2, 5, 3]
[4, 1, 7, 2, 5, 3, 6]
[5, 1, 8, 3, 6, 2, 7, 4]
[5, 1, 9, 3, 7, 2, 6, 4, 8]
import numpy as np
from copy import copy

def bisecting_order(lst):

    # bisecting order of an unordered list
    result = []
    l = len(lst)
    if l < 3:
        return lst
    result.append(closest(lst,np.mean(lst)))
    result.append(min(lst))
    result.append(max(lst))

    # get bisections
    while len(result)!=len(lst):
        temp_list = copy(result)
        temp_list.sort()
        for i in xrange(len(temp_list)-1):
            newnum = closest(lst,np.mean([temp_list[i],temp_list[i+1]]))
            if newnum in result:
                continue
            else:
                result.append(newnum)
    return result

def closest(mylist,mynum):
    return min(mylist, key=lambda x:abs(x-mynum))