【Python】蜗牛排序

【Python】蜗牛排序,第1张

【Python】蜗牛排序

给定一个 n x n数组,返回从最外面的元素到中间的元素排列的数组元素,顺时针方向移动。
例如:

array = [[1,2,3],
         [4,5,6],
         [7,8,9]]
snail(array) #=> [1,2,3,6,9,8,7,4,5]
array = [[1,2,3],
         [8,9,4],
         [7,6,5]]
snail(array) #=> [1,2,3,4,5,6,7,8,9]

具体排序如图:

Python 代码实现

如果各位大神有更好的步骤,欢迎指出呀!

简单的循环解法 第一种:
# 蜗牛排序
array = [
    [1, 2, 3],
    [4, 5, 6],
    [4, 5, 6]
]


def snail(arrays):
    arr_list = cycle(arrays)
    arr = arr_list[1]
    lists = arr_list[0]

    while len(arr) != 0:
        # 执行蜗牛排序
        arr_list = cycle(arrays)
        arr = arr_list[1]
        lists += arr_list[0]
    # print(lists)
    return lists


def cycle(arrays):
    arr_list = arrays
    # 获取列表长度
    length = len(arr_list)
    lists = []
    popList = []
    for i in range(length):
        # 第一个列表正常排序
        if i == 0:
            [lists.append(i) for i in arr_list[i]]
        # 获取除第一个列表外的其他列表的最后一位数
        elif i < length:
            lists.append(arr_list[i][length - 1])
            arr_list[i].pop(length - 1)
            # 移除已排序的数字
            popList.append(arr_list[i].pop(0))
            # 反转最后一个列表
            if i == length - 1:
                arr_list[i].reverse()
                [lists.append(i) for i in arr_list[i]]

    # 反转抛出列表并填充进入排序
    popList.reverse()
    for i in popList:
        lists.append(i)

    # 使函数跳出循环
    arr_list.pop(0)
    length = len(arr_list)
    if length == 0:
        pass
    else:
        arr_list.pop(length - 1)

    return lists, arr_list


print(snail(array))
第二种
def snail(array):
    ret = []
    if array and array[0]:
        size = len(array)
        for n in range((size + 1) // 2):
            for x in range(n, size - n):
                ret.append(array[n][x])
            for y in range(1 + n, size - n):
                ret.append(array[y][-1 - n])
            for x in range(2 + n, size - n + 1):
                ret.append(array[-1 - n][-x])
            for y in range(2 + n, size - n):
                ret.append(array[-y][n])
    return ret
第三种
def snail(array):
    next_dir = {"right": "down", "down":"left", "left":"up", "up":"right"}
    dir = "right"
    snail = []
    while array:
        if dir == "right":
            snail.extend(array.pop(0))
        elif dir == "down":
            snail.extend([x.pop(-1) for x in array])
        elif dir == "left":
            snail.extend(list(reversed(array.pop(-1))))
        elif dir == "up":
            snail.extend([x.pop(0) for x in reversed(array)])    
        dir = next_dir[dir]
    return snail  
使用第三方库
import numpy as np

def snail(array):
    m = []
    array = np.array(array)
    while len(array) > 0:
        m += array[0].tolist()
        array = np.rot90(array[1:])
    return m
其他解法
def snail(array):
    out = []
    while len(array):
        out += array.pop(0)
        array = list(zip(*array))[::-1] # Rotate
    return out

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5680353.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存