如何将任何列的每个元素完全放在彼此之下?

时间:2017-10-26 20:39:06

标签: python python-2.7

我的代码output中存在问题;
每列的元素并不完全相互放置。

我原来的代码太忙了,所以我把它简化为一个简单的代码;
所以首先,les解释这个简单的:

首先考虑一个简单的问题如下: 编写一个代码,它接收一个自然数r,作为行数;
并收到另一个自然数c,作为列数;
然后打印所有自然数字 在1行和rc列中填写rc

所以code将如下所示:

r = int(input("How many Rows? "));     ## here r stands for number of rows 
c = int(input("How many columns? "));  ## here c stands for number of columns 

for i in range(1,r+1): 
    for j in range (1,c+1): 
        print(j+c*(i-1)) , 
    print 

output如下:

How many Rows? 5
How many columns? 6
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 26 27 28 29 30
>>> 

或:

How many Rows? 7
How many columns? 3
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
19 20 21
>>> 

我该怎么做才能得到output这样的人?

How many Rows? 5
How many columns? 6
 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 26 27 28 29 30
>>> 

How many Rows? 7
How many columns? 3
 1  2  3
 4  5  6
 7  8  9
10 11 12
13 14 15
16 17 18
19 20 21
>>> 
  

现在我的原始代码类似于以下内容:

def function(n): 
    R=0;
    something...something...something...
    something...something...something...
    something...something...something...
    something...something...something...
    return(R)


r = int(input("How many Rows? "));     ## here r stands for number of rows 
c = int(input("How many columns? "));  ## here c stands for number of columns 

for i in range(0,r+1):
    for j in range(0,c+1)
        n=j+c*(i-1);
        r=function(n);
print (r)

现在为了简单起见,假设通过一些手动操作我们得到:
f(1)=function(1)=17f(2)=235f(3)=-8;
f(4)=-9641f(5)=54278249f(6)=411;

现在,当我运行代码时,out put如下:

How many Rows? 2
How many columns? 3
17
235
-8
-9641
54278249 
41
>>> 

我做了什么来获得output这样的话:

How many Rows? 2
How many columns? 3
   17      235  -8
-9641 54278249 411
>>> 

另请注意,我不想得到这样的内容:

How many Rows? 2
How many columns? 3
17 235 -8
-9641 54278249 411
>>> 

4 个答案:

答案 0 :(得分:3)

使用rjust方法:

r,c = 5,5

for i in range(1,r+1): 
    for j in range (1,c+1):
        str_to_printout = str(j+c*(i-1)).rjust(2) 
        print(str_to_printout), 
    print 

结果:

 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

UPD。

至于你的上一个例子,我们假设f(n)以这种方式定义:

def f(n):
    my_dict = {1:17, 2:235, 3:-8, 4:-9641, 5:54278249, 6:411}
    return my_dict.get(n, 0)

然后您可以使用以下方法:

r,c = 2,3

# data table with elemets in string format
data_str = [[str(f(j+c*(i-1))) for j in range (1,c+1)] for i in range(1,r+1)]

# transposed data table and list of max len for every column in data_str
data_str_transposed = [list(i) for i in zip(*data_str)] 
max_len_columns = [max(map(len, col)) for col in data_str_transposed] 

# printing out
# the string " " before 'join' is a delimiter between columns 
for row in data_str:
    print(" ".join(elem.rjust(max_len) for elem, max_len in zip(row, max_len_columns)))

结果:

   17      235  -8
-9641 54278249 411

使用r,c = 3,3

   17      235  -8
-9641 54278249 411
    0        0   0

请注意,每列中的缩进对应于此列中的最大长度,而不是整个表中的缩写。

答案 1 :(得分:1)

希望这会有所帮助。如果您需要进一步说明,请发表评论。

#   result stores the final matrix
#   max_len stores the length of maximum element

result, max_len = [], 0
for i in range(1, r + 1):
    temp = []
    for j in range(1, c + 1):
        n = j + c * (i - 1);
        r = function(n);
        if len(str(r)) > max_len:
            max_len = len(str(r))
        temp.append(r)
    result.append(temp)

#   printing the values seperately to apply rjust() to each and every element

for i in result:
    for j in i:
        print(str(j).rjust(max_len), end=' ')
    print()

答案 2 :(得分:1)

MaximTitarenko的回答:

首先查找最小值和最大值,然后确定哪个是较长的值,并使用其长度作为rjust(x)调用的值。

import random 

r,c = 15,5

m = random.sample(xrange(10000), 100)
length1 = len(str(max(m)))
length2 = len(str(min(m)))

longest = max(length1, length2)

for i in range(r): 
    for j in range (c):
        str_to_printout = str(m[i*c+j]).rjust(longest) 
        print(str_to_printout),
    print

示例输出:

 937 9992 8602 4213 7053
1957 9766 6704 8051 8636
 267  889 1903 8693 5565
8287 7842 6933 2111 9689
3948  428 8894 7522  417
3708 8033  878 4945 2771
6393   35 9065 2193 6797
5430 2720  647 4582 3316
9803 1033 7864  656 4556
6751 6342 4915 5986 6805
9490 2325 5237 8513 8860
8400 1789 2004 4500 2836
8329 4322 6616  132 7198
4715  193 2931 3947 8288
1338 9386 5036 4297 2903

答案 3 :(得分:0)

您需要使用string method .rjust

从文档(上面链接):

  

<强> string.rjust(s, width[, fillchar])

     

此函数右对齐给定string字段中的width。它返回一个至少string个字符宽的width,通过用string填充字符fillchar(默认为空格)创建,直到右边的给定宽度为止。字符串永远不会被截断。

因此,我们需要计算每个width应该number的{​​{1}}(以字符为单位)。这非常简单,只有padded rows* columns +的数量(1之间增加了一个空格间隔每个+1)。

使用它,编写代码变得非常简单:

column

分别为r = int(input("How many Rows? ")) c = int(input("How many columns? ")) width = len(str(r*c)) + 1 for i in range(1,r+1): for j in range(1,c+1): print str(j+c*(i-1)).rjust(width) , print r c45

outputs

希望这可以帮助你,你可以自己适应其他情况!