2017-06-07 1 views
3

Je suis un débutant peu à Python et je suis à la recherche d'une fonction qui convertira toute n x nListe 2D à une liste 1D dans sens horaire .Python: liste 2D à 1D dans le sens des aiguilles d'une montre?

Par exemple:

Lorsque n = 3

list = [[2, 3, 5],[ 8, 7, 1],[ 0, 4, 6]]

ou

list = [[2, 3, 5] 
     ,[8, 7, 1] 
     ,[0, 4, 6]] 

deviendrait

result = [2, 3, 5, 1, 6, 4, 0, 8, 7] 

et quand n = 5

list = [[2, 3, 5, 9, 10],[ 8, 7, 1, 11, 13],[ 0, 4, 6, 21, 22], [12, 19, 17, 18, 25], [14, 15, 16, 23, 24]]

ou

list = [[ 2, 3, 5, 9, 10] 
     ,[ 8, 7, 1, 11, 13] 
     ,[ 0, 4, 6, 21, 22] 
     ,[ 12, 19, 17, 18, 25] 
     , [ 14, 15, 16, 23, 24]] 

deviendrait

result = [2, 3, 5, 9, 10, 13, 22, 25, 24, 23, 16, 15, 14, 12, 0, 8, 7, 1, 11, 21, 18, 17, 19, 4, 6] 

Comment puis-je faire efficacement que pour toute valeur de n x n ??

+0

Vous cherchez quelque chose qui fonctionnera pour les listes de nxn? ou juste 3x3 –

+0

@JackEvans Pour tout nxn: ') –

+0

Pourriez-vous donner des exemples supplémentaires de rotation dans le sens des aiguilles d'une montre dans des listes de tailles différentes? –

Répondre

1

Adapté de Print two-dimensional array in spiral order

import itertools 

arr = [[2, 3, 5, 9, 10], 
     [8, 7, 1, 11, 13], 
     [0, 4, 6, 21, 22], 
     [12, 19, 17, 18, 25], 
     [14, 15, 16, 23, 24]] 


def transpose_and_yield_top(arr): 
    while arr: 
     yield arr[0] 
     arr = list(zip(*arr[1:]))[::-1] 


rotated = list(itertools.chain(*transpose_and_yield_top(arr))) 
+0

Apprécié. Merci: ') –

0
lists = [[2, 3, 5],[ 8, 7, 1],[ 0, 4, 6]] 
output_list = [item for list in lists for item in list] 
+0

Voir, c'est le point . Vous avez seulement converti la liste 2D en liste 1D (en omettant le point de ** conversion horaire) ** –

1

Cela ressemble à une question d'examen - est-il ?!

Ce serait ma solution en utilisant la récursivité et les opérateurs de manipulation de liste Python:

def clockwise(input_list, output_list): 
    list_size = len(input_list[0]) 
    if list_size == 1: 
     output_list.append(input_list[0][0]) 
    else: 
     for i in range(list_size): 
      output_list.append(input_list[0][i]) 

     for i in range(list_size)[1:]: 
      output_list.append(input_list[i][list_size - 1]) 

     for i in reversed(range(list_size)[:-1]):  
      output_list.append(input_list[list_size - 1][i]) 

     for i in reversed(range(list_size)[1:-1]):  
      output_list.append(input_list[i][0]) 

     new_list = list() 
     for i in range(list_size - 2): 
      new_list.append(input_list[i + 1][1:-1]) 

     return clockwise(new_list, output_list) 

l = [[2, 3, 5, 9, 10],[ 8, 7, 1, 11, 13],[ 0, 4, 6, 21, 22], [12, 19, 17, 18, 25], [14, 15, 16, 23, 24]] 
output_list = [] 
clockwise(l, output_list) 

print output_list 
+1

Non, c'est une de mes choses de projet; il en avait besoin pour l'algo du modèle binaire local. Merci beaucoup pour l'aide si. : ') –

1

Cela fonctionne aussi:

from math import floor 

lists = [[ 2, 3, 5, 9, 10] 
     ,[ 8, 7, 1, 11, 13] 
     ,[ 0, 4, 6, 21, 22] 
     ,[ 12, 19, 17, 18, 25] 
     , [ 14, 15, 16, 23, 24]] 

n = len(lists) # assume each list also has n-length 

output_list = [] 

idx = 0 
while idx <= floor(n/2): 

    if len(output_list) == n*n: 
     break 

    # across -> 
    print("Across ->") 
    for item in lists[idx][idx:n-idx]: 
     output_list.append(item) 
    print(output_list) 

    if len(output_list) == n*n: 
     break 

    # down 
    print("Down") 
    for _idx in range(idx+1, n-idx-1): 
     output_list.append(lists[_idx][n-idx-1]) 
    print(output_list) 

    if len(output_list) == n*n: 
     break 

    # across <- 
    print("Across <-") 
    for _idx in range(n-idx-1, idx-1, -1): 
     output_list.append(lists[n-idx-1][_idx]) 
    print(output_list) 

    if len(output_list) == n*n: 
     break 

    # up 
    print("Up") 
    for _idx in range(n-idx-2, idx, -1): 
     output_list.append(lists[_idx][idx]) 
    print(output_list) 

    idx += 1 


print("\nOutput: ") 
print(output_list) 
+0

Il pourrait être nettoyé de quelques façons, mais la logique est là. –

+0

Pas de problème. Je vous remercie :') –

0
import math 
import numpy as np 

def print_wall(input, result): 

    n = input.shape[0] 

    for i in range(n): # print top outer 
     result.append(input[0][i]) 

    for i in range(n - 1): # print right outer 
     result.append(input[i + 1][n - 1]) 

    for i in range(n - 1): # print bottom outer 
     result.append(input[n - 1][n - 2 - i]) 

    for i in range(n - 2): # print left outer 
     result.append(input[n - 2 - i][0]) 

def clock_wise(input): 

    n = input.shape[0] 

    result = list() 

    for i in range(math.ceil(n/2)): # from the outer to the inner 

     print_wall(input[i: n - i, i: n - i], result) 

    print(result) 

Cette impression méthode de l'extérieur du tableau à l'intérieur du tableau. Par exemple, le tableau est la suivante:

1 2 3 4 5 
6 7 8 9 10 
11 12 13 14 15 
16 17 18 19 20 
21 22 23 24 25 

Dans un premier temps, imprimer la partie extérieure de la matrice 5x5 dans le sens des aiguilles d'horloge, a obtenu 1 2 3 4 5 10 15 20 25 24 23 22 21 16 11 6;

Ensuite, traiter la matrice intérieure (3x3):

7 8 9 
12 13 14 
17 18 19 

imprimer l'extérieur de la matrice 3x3 dans le sens des aiguilles d'horloge, obtenu 14 7 8 9 19 18 17 12;

Enfin, face à 13.