【问题标题】:how to print ones and zeros in columns with their indexes in python?如何在 python 中使用索引在列中打印 1 和 0?
【发布时间】:2020-10-29 14:17:55
【问题描述】:

我有一个零和一的列表,我想将它们打印在带有标题和索引号的两个不同列中。像这样的东西。 列表 = [1,0,1,1,1,0,1,0,1,0,0]

ones      zeros
1 1       2 0
3 1       6 0
4 1       8 0
5 1       10 0
7 1       11 0
9 1

这是所需的输出。

我试过这个:

list = [1,0,1,1,1,0,1,0,1,0,0]

print('ones',end='\t')
print('zeros')

for index,ele in enumerate(list,start=1):
    if ele==1:
        print(index,ele,end="    ")
    elif ele==0:
        print("    ")
        print(index,ele,end="    ")
    else:
        print()

但这会给出如下输出:

ones    zeros
1 1        
2 0    3 1    4 1    5 1        
6 0    7 1        
8 0    9 1        
10 0        
11 0   

如何获得所需的输出? 任何帮助表示赞赏。

【问题讨论】:

  • 考虑先创建数据,然后打印(这将使您更容易格式化,就像您对标题所做的那样)

标签: python python-3.x indexing printing multiple-columns


【解决方案1】:

您可以使用itertools.zip_longeststr.ljust、f-strings(用于格式化)和打印部分的一些计算,并使用两个列表来保存零和一的索引:

l = [1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0]

ones, zeros = [], []
max_len_zeros = max_len_ones = 0

for index, num in enumerate(l, 1):
  if num == 0:
    zeros.append(index)
    max_len_zeros = max(max_len_zeros, len(str(index)))
  else:
    ones.append(index)
    max_len_ones = max(max_len_ones, len(str(index)))

from itertools import zip_longest

print('ones' + ' ' * (max_len_ones + 2) + 'zeros')

for ones_index, zeros_index in zip_longest(ones, zeros, fillvalue = ''):
  one = '1' if ones_index else ' '
  this_one_index = str(ones_index).ljust(max_len_ones)
  zero = '0' if zeros_index else ''
  this_zero_index = str(zeros_index).ljust(max_len_zeros)
  print(f'{this_one_index} {one}    {this_zero_index} {zero}')

输出:

ones   zeros
1 1    2  0
3 1    6  0
4 1    8  0
5 1    10 0
7 1    11 0
9 1        

0 多于 1 的列表:

In: l = [1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0]
Out:
ones    zeros
1  1    2  0
4  1    3  0
7  1    5  0
9  1    6  0
10 1    8  0
14 1    11 0
        12 0
        13 0
        15 0

0 和 1 数量相等的列表:

In: l = [1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1]
Out:
ones    zeros
1  1    2  0
3  1    4  0
5  1    6  0
8  1    7  0
9  1    10 0
11 1    13 0
12 1    14 0
15 1    16 0
18 1    17 0
20 1    19 0

【讨论】:

    【解决方案2】:

    很难以迭代的方式完成您需要的工作。我有一种“破碎”的解决方案,它既展示了如何更好地做你想做的事情,又展示了为什么在这种情况下迭代方法受到限制。

    我将您的代码更新如下:

    list = [1,0,1,1,1,0,1,0,1,0,0]
    
    print('ones',end='\t')
    print('zeros')
    
    for index,ele in enumerate(list,start=1):
      # First check if extra space OR new lines OR both are needed
      if index > 1:
        if ele==1:
          print()
        elif ele==0:
          if list[index-2]==1:
            print('', end=' \t')
          else:
            print('', end='\n\t\t')
    
      # THEN, write your desired output without any end
      if ele==1:
        print(index,ele,end="")
      elif ele==0:
        print(index,ele,end="")
    
    # Finally an empty line
    print()
    
    

    它给出以下输出:

    ones    zeros
    1 1     2 0
    3 1
    4 1
    5 1     6 0
    7 1     8 0
    9 1     10 0
            11 0
    

    如您所见,它的限制是您不能“向上”并在旧行中重写。

    但是,如果您需要完全按照您显示的方式显示,则需要构建一个中间数据结构(例如dict),然后使用zip 显示它

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多