2017-06-07 3 views
3

Ich bin ein bisschen Neuling auf Python und ich bin auf der Suche nach einem Funktion die jede n x n2D-Liste in eine 1D-Liste konvertieren in Uhrzeigersinn .Python: 2D zu 1D Liste im Uhrzeigersinn?

Zum Beispiel:

wenn n = 3

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

oder

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

würde

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

und wenn 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]]

oder

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]] 

würde

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] 

Wie kann ich effizient zu tun, dass für jeden Wert von n x n ?? Das klingt wie eine Prüfung Frage

+0

Sind Sie auf der Suche nach etwas, das für Listen von jedem nxn funktioniert? oder nur 3x3 –

+0

@JackEvans Für jede nxn: ') –

+0

Könnten Sie zusätzliche Beispiele für die Drehung im Uhrzeigersinn in unterschiedlich großen Listen geben? –

Antwort

1

von 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

Anerkannt. Danke: ') –

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

Siehe, das ist der Punkt . Sie haben nur die 2D-Liste in die 1D-Liste konvertiert (fehlt der Punkt ** im Uhrzeigersinn **) –

1

Angepasst - ist es ?!

Das wäre meine Lösung unter Verwendung von Rekursion und Python Liste Manipulation Operatoren sein:

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

Nein, es ist eines meiner Projekt-Ding; brauchte es für Local binary pattern algo. Vielen Dank für die Hilfe. : ') –

1

Dies funktioniert auch:

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

Es könnte auf ein paar Arten aufgeräumt werden, aber die Logik ist da. –

+0

Kein Problem. Vielen Dank :') –

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) 

Diese Methode Druck von der Außen der Anordnung der inneren des Arrays. Zum Beispiel können die Arrays ist:

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 

Zuerst wird das äußere der 5x5-Array in der Uhrzeigersinn-Richtung drucken, bekam 1 2 3 4 5 10 15 20 25 24 23 22 21 16 11 6;

Dann befassen sich mit der inneren Anordnung (3x3):

7 8 9 
12 13 14 
17 18 19 

Drucke der äußere des 3x3-Array in die Richtung im Uhrzeigersinn, bekam 7 8 9 14 19 18 17 12;

Endlich, beschäftigen Sie sich mit 13.