【问题标题】:How to print two lists of different size side by side?如何并排打印两个不同大小的列表?
【发布时间】:2020-03-27 10:52:49
【问题描述】:

我有两个不同长度的列表要并排打印,用制表符分隔。举个例子:

a_list = ["a","b","c","d","e"]
b_list = ["f","g","h","i","j","k","l","m","n"]

我试过了:

print('A-list:'+ '\t' + 'B-list:')
for i in range(len(b_list)):
    print(a_list[i] + '\t' + b_list[i])

我当然会得到一个“超出范围的跟踪”,因为一个列表更短。我确实希望使用 zip。

【问题讨论】:

    标签: python list python-3.4


    【解决方案1】:

    因为b_list 的长度大于a_list 的长度,所以您的代码正在提高IndexError,为此,您可以使用try except 语句:

    for i in range(max(len(b_list), len(a_list))):
        try:
            print(f"{a_list[i]}\t", end="")
        except IndexError:
            print(f" \t", end="")
        try:
            print(f"{b_list[i]}\t")
        except IndexError:
            print(f" \t")
    

    输出:

    a   f
    b   g
    c   h
    d   i
    e   j
        k
        l
        m
        n
    

    【讨论】:

    • 谢谢,但我不希望使用 zip 或其他需要导入的功能
    • 如果 list_a 更长会失败
    • “我有两个不同长度的列表” OP 说。这是一个例子。问题是你的代码应该能够并排打印两个不同长度的列表。
    • @mahyard 和?你测试了最后一个版本吗?
    • 这样更好。但实际上我更喜欢避免使用 try-except。经常使用它们会使您的代码可读性降低且难以理解。但它工作正常。
    【解决方案2】:

    这是一个可能的解决方案。 a_listb_list 长还是短都没有关系。

    def get(lst, idx):
        try:
            return lst[idx]
        except:
            return " "
    
    a_list = ['a','b','c','d','e'] 
    b_list = ['f','g','h','i','j','k','l','m','n']
    
    result = []
    
    for i in range(min(len(a_list), len(b_list))):
        result.append(get(a_list, i))
        result.append(get(b_list, i))
    
    for i in range(min(len(a_list), len(b_list)), max(len(a_list), len(b_list))):
        result.append(get(a_list, i))
        result.append(get(b_list, i))
    
    print('\n'.join('\t'.join((result[i], result[i+1]))
                              for i in range(0, len(result), 2)))
    

    这会打印出预期的输出:

    a   f
    b   g
    c   h
    d   i
    e   j
        k
        l
        m
        n
    
    

    【讨论】:

      【解决方案3】:

      没有任何额外的循环:

      list_a = ["A", "B", "C"]
      list_b = ["1", "2", "3", "4"]
      len_a = len(list_a)
      len_b = len(list_b)
      i = 0
      while True:
          if i < len_a:
              print(list_a[i], end="")
          if i < len_b:
              print("\t", list_b[i], end="")
          print()
          i += 1
          if i > max(len_a, len_a):
              break
      

      【讨论】:

        【解决方案4】:
        def iterate(a_list, b_list):
          # iterate through short list
          min_length = min(((len(a_list), len(b_list)))) 
        
          for i in range(min_length):
            print('{}\t{}'.format(a_list[i], b_list[i]))
        
          # print remaining items accordingly
          if i + 1 == len(a_list):
            for item in b_list[i+1:]:
              print('\t{}'.format(item))  
          else:
            for item in a_list[i+1:]:
              print(item) 
        
        

        我建议使用允许您在列表中包含任何类型的元素的字符串方法格式。

        【讨论】:

          【解决方案5】:

          在所有解决方案中,诀窍是遍历最长的列表,并为较短列表中的缺失条目使用空白空间。

          例如:

          a_list = ['a','b','c','d','e'] 
          b_list = ['f','g','h','i','j','k','l','m','n']
          
          for i in range(max(len(a_list),len(b_list))):
              a = a_list[i:i+1] or [""]
              b = b_list[i:i+1] or [""]
              print(a[0]+"\t"+b[0])
          

          如果您不关心内存使用情况,您还可以用空格填充列表,以便简化打印过程,假设列表大小相同:

          padding  = len(b_list)-len(a_list)
          a_padded = a_list + [""]*padding
          b_padded = b_list + [""]*-padding
          for i in range(len(a_padded)):
              print(a_padded[i]+"\t"+b_padded[i])
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-12-06
            • 2023-02-10
            • 1970-01-01
            • 2016-08-28
            • 2013-11-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多