Table Printer excercise











up vote
3
down vote

favorite
1












I'm new to Python and I came to the following excercise:




Write a function named printTable() that takes a list of lists of
strings and displays it in a well-organized table with each column
right-justified. Assume that all the inner lists will contain the same
number of strings. For example, the value could look like this:



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


Your printTable() function would print the following:



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



My solution is this:



table_printer.py



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

def printTable(tableData):
"""
Print table neatly formatted:
e.g:

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

becomes:

apples Alice dogs
oranges Bob cats
cherries Carol moose
banana David goose
"""
# make list of ints to store later max len element of each list
colWidths = [0] * len(tableData)

# Store maxlen of each list
i = 0
while i < len(tableData):
colWidths[i] = len(max(tableData[i], key=len))
i = i + 1

# Print formatted
for x in range(len(tableData[0])):
for y in range(len(colWidths)):
print(tableData[y][x].rjust(colWidths[y]), end=' ')
print(end='n')

printTable(tableData)


I wonder if this is a good solution or if there is an easier/better way. It took me quite some time to come up with a solution. Still I feel its probaly not very elegant. Maybe I'm overcomplicating it because I came from C/C++ where you oftenly have to do stuff by hand.



I read that it's often not a good idea in python to write loops like in other languages with explicit indices (what I basically did here). Are there any alternatives?










share|improve this question
























  • You can compute the maximal length on each row by np.array([np.array(max([len(xii) for xii in xi])) for xi in tableData]) which returns [8 5 5]. These numbers will be used to format the strings.
    – Sigur
    Nov 23 at 2:11















up vote
3
down vote

favorite
1












I'm new to Python and I came to the following excercise:




Write a function named printTable() that takes a list of lists of
strings and displays it in a well-organized table with each column
right-justified. Assume that all the inner lists will contain the same
number of strings. For example, the value could look like this:



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


Your printTable() function would print the following:



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



My solution is this:



table_printer.py



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

def printTable(tableData):
"""
Print table neatly formatted:
e.g:

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

becomes:

apples Alice dogs
oranges Bob cats
cherries Carol moose
banana David goose
"""
# make list of ints to store later max len element of each list
colWidths = [0] * len(tableData)

# Store maxlen of each list
i = 0
while i < len(tableData):
colWidths[i] = len(max(tableData[i], key=len))
i = i + 1

# Print formatted
for x in range(len(tableData[0])):
for y in range(len(colWidths)):
print(tableData[y][x].rjust(colWidths[y]), end=' ')
print(end='n')

printTable(tableData)


I wonder if this is a good solution or if there is an easier/better way. It took me quite some time to come up with a solution. Still I feel its probaly not very elegant. Maybe I'm overcomplicating it because I came from C/C++ where you oftenly have to do stuff by hand.



I read that it's often not a good idea in python to write loops like in other languages with explicit indices (what I basically did here). Are there any alternatives?










share|improve this question
























  • You can compute the maximal length on each row by np.array([np.array(max([len(xii) for xii in xi])) for xi in tableData]) which returns [8 5 5]. These numbers will be used to format the strings.
    – Sigur
    Nov 23 at 2:11













up vote
3
down vote

favorite
1









up vote
3
down vote

favorite
1






1





I'm new to Python and I came to the following excercise:




Write a function named printTable() that takes a list of lists of
strings and displays it in a well-organized table with each column
right-justified. Assume that all the inner lists will contain the same
number of strings. For example, the value could look like this:



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


Your printTable() function would print the following:



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



My solution is this:



table_printer.py



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

def printTable(tableData):
"""
Print table neatly formatted:
e.g:

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

becomes:

apples Alice dogs
oranges Bob cats
cherries Carol moose
banana David goose
"""
# make list of ints to store later max len element of each list
colWidths = [0] * len(tableData)

# Store maxlen of each list
i = 0
while i < len(tableData):
colWidths[i] = len(max(tableData[i], key=len))
i = i + 1

# Print formatted
for x in range(len(tableData[0])):
for y in range(len(colWidths)):
print(tableData[y][x].rjust(colWidths[y]), end=' ')
print(end='n')

printTable(tableData)


I wonder if this is a good solution or if there is an easier/better way. It took me quite some time to come up with a solution. Still I feel its probaly not very elegant. Maybe I'm overcomplicating it because I came from C/C++ where you oftenly have to do stuff by hand.



I read that it's often not a good idea in python to write loops like in other languages with explicit indices (what I basically did here). Are there any alternatives?










share|improve this question















I'm new to Python and I came to the following excercise:




Write a function named printTable() that takes a list of lists of
strings and displays it in a well-organized table with each column
right-justified. Assume that all the inner lists will contain the same
number of strings. For example, the value could look like this:



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


Your printTable() function would print the following:



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



My solution is this:



table_printer.py



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

def printTable(tableData):
"""
Print table neatly formatted:
e.g:

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

becomes:

apples Alice dogs
oranges Bob cats
cherries Carol moose
banana David goose
"""
# make list of ints to store later max len element of each list
colWidths = [0] * len(tableData)

# Store maxlen of each list
i = 0
while i < len(tableData):
colWidths[i] = len(max(tableData[i], key=len))
i = i + 1

# Print formatted
for x in range(len(tableData[0])):
for y in range(len(colWidths)):
print(tableData[y][x].rjust(colWidths[y]), end=' ')
print(end='n')

printTable(tableData)


I wonder if this is a good solution or if there is an easier/better way. It took me quite some time to come up with a solution. Still I feel its probaly not very elegant. Maybe I'm overcomplicating it because I came from C/C++ where you oftenly have to do stuff by hand.



I read that it's often not a good idea in python to write loops like in other languages with explicit indices (what I basically did here). Are there any alternatives?







python beginner strings formatting






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited yesterday









Neves4

428




428










asked Nov 22 at 19:59









Sandro4912

686121




686121












  • You can compute the maximal length on each row by np.array([np.array(max([len(xii) for xii in xi])) for xi in tableData]) which returns [8 5 5]. These numbers will be used to format the strings.
    – Sigur
    Nov 23 at 2:11


















  • You can compute the maximal length on each row by np.array([np.array(max([len(xii) for xii in xi])) for xi in tableData]) which returns [8 5 5]. These numbers will be used to format the strings.
    – Sigur
    Nov 23 at 2:11
















You can compute the maximal length on each row by np.array([np.array(max([len(xii) for xii in xi])) for xi in tableData]) which returns [8 5 5]. These numbers will be used to format the strings.
– Sigur
Nov 23 at 2:11




You can compute the maximal length on each row by np.array([np.array(max([len(xii) for xii in xi])) for xi in tableData]) which returns [8 5 5]. These numbers will be used to format the strings.
– Sigur
Nov 23 at 2:11










1 Answer
1






active

oldest

votes

















up vote
1
down vote













Here is my proposal. It is shorter than OP's solution, specially to compute the length of each word to be used in the format procedure while printing.



In a single line, we obtain a 1D array with maximal lengths.



import numpy as np

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

max_len = np.array([np.array(max([len(xii) for xii in xi])) for xi in tableData])

for col in range(len(tableData[0])):
for i in range(len(tableData)):
print ("{:>%d}" % max_len[i]).format(tableData[i][col]),
print ""


Output



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





share|improve this answer























  • Hello. While the solution is a nice one, your answer just provides and alternative to OP's code which is not what this site is about. Please expand your answer and explain how you're improving OP's solution.
    – яүυк
    yesterday










  • @яүυк, hello. Since my knowledge is not big, I tried to improve it. To be true, my code is shorter but I am not sure if it is more efficient. What do you think?
    – Sigur
    yesterday











Your Answer





StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");

StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "196"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














 

draft saved


draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f208246%2ftable-printer-excercise%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes








up vote
1
down vote













Here is my proposal. It is shorter than OP's solution, specially to compute the length of each word to be used in the format procedure while printing.



In a single line, we obtain a 1D array with maximal lengths.



import numpy as np

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

max_len = np.array([np.array(max([len(xii) for xii in xi])) for xi in tableData])

for col in range(len(tableData[0])):
for i in range(len(tableData)):
print ("{:>%d}" % max_len[i]).format(tableData[i][col]),
print ""


Output



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





share|improve this answer























  • Hello. While the solution is a nice one, your answer just provides and alternative to OP's code which is not what this site is about. Please expand your answer and explain how you're improving OP's solution.
    – яүυк
    yesterday










  • @яүυк, hello. Since my knowledge is not big, I tried to improve it. To be true, my code is shorter but I am not sure if it is more efficient. What do you think?
    – Sigur
    yesterday















up vote
1
down vote













Here is my proposal. It is shorter than OP's solution, specially to compute the length of each word to be used in the format procedure while printing.



In a single line, we obtain a 1D array with maximal lengths.



import numpy as np

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

max_len = np.array([np.array(max([len(xii) for xii in xi])) for xi in tableData])

for col in range(len(tableData[0])):
for i in range(len(tableData)):
print ("{:>%d}" % max_len[i]).format(tableData[i][col]),
print ""


Output



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





share|improve this answer























  • Hello. While the solution is a nice one, your answer just provides and alternative to OP's code which is not what this site is about. Please expand your answer and explain how you're improving OP's solution.
    – яүυк
    yesterday










  • @яүυк, hello. Since my knowledge is not big, I tried to improve it. To be true, my code is shorter but I am not sure if it is more efficient. What do you think?
    – Sigur
    yesterday













up vote
1
down vote










up vote
1
down vote









Here is my proposal. It is shorter than OP's solution, specially to compute the length of each word to be used in the format procedure while printing.



In a single line, we obtain a 1D array with maximal lengths.



import numpy as np

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

max_len = np.array([np.array(max([len(xii) for xii in xi])) for xi in tableData])

for col in range(len(tableData[0])):
for i in range(len(tableData)):
print ("{:>%d}" % max_len[i]).format(tableData[i][col]),
print ""


Output



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





share|improve this answer














Here is my proposal. It is shorter than OP's solution, specially to compute the length of each word to be used in the format procedure while printing.



In a single line, we obtain a 1D array with maximal lengths.



import numpy as np

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

max_len = np.array([np.array(max([len(xii) for xii in xi])) for xi in tableData])

for col in range(len(tableData[0])):
for i in range(len(tableData)):
print ("{:>%d}" % max_len[i]).format(tableData[i][col]),
print ""


Output



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






share|improve this answer














share|improve this answer



share|improve this answer








edited yesterday

























answered Nov 23 at 2:12









Sigur

17810




17810












  • Hello. While the solution is a nice one, your answer just provides and alternative to OP's code which is not what this site is about. Please expand your answer and explain how you're improving OP's solution.
    – яүυк
    yesterday










  • @яүυк, hello. Since my knowledge is not big, I tried to improve it. To be true, my code is shorter but I am not sure if it is more efficient. What do you think?
    – Sigur
    yesterday


















  • Hello. While the solution is a nice one, your answer just provides and alternative to OP's code which is not what this site is about. Please expand your answer and explain how you're improving OP's solution.
    – яүυк
    yesterday










  • @яүυк, hello. Since my knowledge is not big, I tried to improve it. To be true, my code is shorter but I am not sure if it is more efficient. What do you think?
    – Sigur
    yesterday
















Hello. While the solution is a nice one, your answer just provides and alternative to OP's code which is not what this site is about. Please expand your answer and explain how you're improving OP's solution.
– яүυк
yesterday




Hello. While the solution is a nice one, your answer just provides and alternative to OP's code which is not what this site is about. Please expand your answer and explain how you're improving OP's solution.
– яүυк
yesterday












@яүυк, hello. Since my knowledge is not big, I tried to improve it. To be true, my code is shorter but I am not sure if it is more efficient. What do you think?
– Sigur
yesterday




@яүυк, hello. Since my knowledge is not big, I tried to improve it. To be true, my code is shorter but I am not sure if it is more efficient. What do you think?
– Sigur
yesterday


















 

draft saved


draft discarded



















































 


draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f208246%2ftable-printer-excercise%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Morgemoulin

Scott Moir

Souastre