2017-01-29 8 views
1

Was ich tun möchte, ist eine berechtigte Spalte aus einem verschachtelten Array zu machen, wie der Titel angibt. Allerdings kann ich einfach nicht herausfinden, wie es funktioniert. Also das das Array ..Python: Spalten von geschachtelten Arrays rechtfertigen

tableData = [['apples', 'oranges', 'cherries', 'banana'], 
['Alice', 'Bob', 'Carol', 'David'], 
['dogs', 'cats', 'moose', 'goose']] 

Dies ist, was ich erreichen will (man beachte die Ausrichtung):

apples Alice dogs 
oranges Bob cats 
cherries Carol moose 
    banana David goose 

konnte ich Code erstellen, um erfolgreich zu jeder der Unteranordnungen zu rechtfertigen aber Mein Ergebnis ist einfach vertikal. Hauptsächlich, weil ich Code nicht herausgefunden habe, um es in Reihen und Spalten zu machen, so habe ich nur eine lange einzelne Spalte. Mein Ergebnis sieht so aus:

apples 
oranges 
cherries 
    banana 
Alice 
    Bob 
Carol 
...#you get the picture 

EDIT: Also meine Frage ist einfach, wie ich es in 3 verschiedenen Spalten brechen würden Sie davon aus nicht wussten bereits die Metadaten des Arrays zB (Anzahl von Sub-Arrays)

Falls Sie meinen Quellcode wollen würde, hier sehen, es ist ...

#function to get the longest word in the sub-array 
#to determine justification length 
def maxLength(someList): 
    count = {} 
    max_num = 0 
    for item in someList: 
     count[item] = len(item) 
    for value in count.values(): 
     if value > max_num: 
      max_num = value 
    return(max_num) 

#function to store the length of the longest words 
#of each sub-array into an array 
def maxWidths(tableData): 
    widths = [] 
    for i in range(len(tableData)): 
     widths.insert(i,maxLength(tableData[i])) 
    return(widths) 

#function to print table(this is the part that needs work)      
def printTable(tableData): 
    widths = maxWidths(tableData) 
    for i in range(len(tableData)): 
     for item in tableData[i]: 
      print(item.rjust(widths[i])) 

ich meinen Code nur enthalten, um zu helfen, aber ich bin sicher, dass sich einige Leute da es in weniger tun können als 10 Linien magisch. Ich würde wirklich gerne diese Art von Antwort sehen (das ist die Art, die ich als die richtige akzeptieren werde), aber bitte erkläre jede seltsame Syntax. Aber wenn Sie nur zu meiner bereits vorhandenen Arbeit hinzufügen möchten, würde das auch für mich großartig und einfacher sein.

Antwort

0

Danke für die Antworten. Beide funktionieren perfekt Ich schreibe nur diese Antwort, weil ich Teile der Bemühungen von beiden zu einem zusammenfügen wollte.

tableData = [['apples', 'oranges', 'cherries', 'banana'], 
      ['Alice', 'Bob', 'Carol', 'David'], 
      ['dogs', 'cats', 'moose', 'goose']] 

#function to get an array of the length of the longest words 
def Widths(tableData): 
    widths = [len(max(column, key=len)) for column in tableData] 
    return(widths) 

#function to print table      
def printTable(tableData): 
    widths = Widths(tableData) 
    for i in range(len(tableData[0])): 
     for j in range(len(tableData)): 
      try: 
       print(tableData[j][i].rjust(widths[j]), end = ' ') 
      except: 
       pass 
     print('') 
0

Sie können zip die Unterlisten, so dass Sie Triplets von Werten erhalten. Dann können Sie die Werte in Spalten von 8 Breite formatiert, 5, 5, rechtsbündig, mit Leerzeichen aufgefüllt (siehe pyformat.info):

for fruit, person, animal in zip(*tableData): 
    print('{: >8} {: >5} {: >5}'.format(fruit, person, animal)) 

Für eine allgemeine Antwort, können Sie die maximale Breite jeder Spalte erhalten, und erstellen sie ein Format-String für jede Breite:

widths = [max(len(value) for value in column) for column in tableData] 
line = ' '.join('{{: >{width}}}'.format(width=width) 
       for width in widths) 
for row in zip(*tableData): 
    print(line.format(*row)) 
+0

Wow ... das ist eine Syntax, mit der ich nicht vertraut bin, aber nehmen wir an, dass Sie die Anzahl der Sub-Arrays oder Datentypen im Array nicht kannten. Wie würdest du damit umgehen? – ITJ

+0

Das wäre eine andere Frage für den gesamten Stack Overflow zu berücksichtigen. –

+0

Wenn Sie sich meinen Quellcode ansehen, werden Sie bemerken, dass ich nie direkt die Metadaten des Arrays verwendet habe. Daher die zahlreichen Funktionen .. – ITJ

0

ich bearbeiten es nach Ihrem EDIT. Sie können dies mit den Grundlagen zu halten tun:

from __future__ import print_function 

tableData = [['apples', 'oranges', 'cherries', 'banana'], 
['Alice', 'Bob', 'Carol', 'David'], 
['dogs', 'cats', 'moose', 'goose']] 
max_width=[] 
for i in tableData: 
    width=[] 
    for obj in range(0,len(i)): 
     width.append(len(i[obj])) #adds the len(i[obj]) 
    max_width.append(max(width)) #appends the length of longest str of the column 

max_height = max(len(i) for i in tableData) #Finds the max height of the array 

for obj in range(0,max_height): #obj is the number of item in a row 
    for index, i in enumerate(tableData): #i a single column in tableData 
     try: #Just in case if one of the rows has fewer item than the rest 
      print ("{0:>{1}}".format(i[obj], max_width[index]+1), end="") #prints it with the proper formatting 
     except: 
      pass 
    print("") 
+0

Dies erledigt definitiv die Arbeit, obwohl Sie Bereich (0,4) ändern sollten, da es Metadaten aus der Tabelle ist. Könnten Sie Kommentare hinzufügen, die mir helfen zu verfolgen, wie das Programm die Aufgabe erledigt hat? – ITJ

+0

@ITJ Sorry, wenn die Kommentare verwirrend sind und ich den Bereich (0,4) geändert habe, um verschiedene Tabellen zu unterstützen. Hoffe es hat geholfen – abccd

Verwandte Themen