【问题标题】:Printing all the values from multiple lists at the same time同时打印多个列表中的所有值
【发布时间】:2019-03-15 01:07:07
【问题描述】:

假设我有 3 个这样的列表

l1 = [1,2,3]
l2 = [4,5,6]
l3 = [7,8,9]

如何同时打印出这些列表中的所有内容? 做这样的事情的pythonic方法是什么?

for f in l1,l2 and l3:
    print f 

这似乎只考虑了 2 个列表。

期望的输出:对于所有列表中的每个元素,我使用不同的函数将它们打印出来

def print_row(filename, status, Binary_Type):
    print " %-45s %-15s %25s " % (filename, status, Binary_Type)

然后我在 for 循环中调用上述函数。

【问题讨论】:

  • for f in l1,l2, l3: print f
  • @cyberbemon,你能编辑你的帖子以包含你想要的输出吗? “同时来自这些列表的所有内容”是模棱两可的,每个人的解释都略有不同。
  • 我认为没有人指出您滥用and 运算符。 l1,l2 and l3 创建一个元组(因为逗号)元组的第一项是l1。元组的第二项是l2 and l3 的结果。由于它们都评估为 true,因此它返回 l3。您正在有效地迭代(l1, l3)。在命令行试试这个看看发生了什么:1,2 and 3。你会得到一个 (1, 3) 的元组。
  • 糟糕,mgilson 在他的回答中解决了这个问题。我会留下我的评论,因为它可能有助于用不同的词来解释它。
  • @DSM 我已经添加了所需的输出。

标签: python list


【解决方案1】:

我想你可能想要zip:

for x,y,z in zip(l1,l2,l3):
    print x,y,z  #1 4 7
                 #2 5 8
                 #3 6 9

你在做什么:

for f in l1,l2 and l3:

有点奇怪。它基本上等同于for f in (l1,l3):,因为l2 and l3 返回l3(假设l2l3 都是非空的——否则,它将返回空的。)

如果你只想连续打印每个列表,你可以这样做:

for lst in (l1,l2,l3):  #parenthesis unnecessary, but I like them...
    print lst   #[ 1, 2, 3 ]
                #[ 4, 5, 6 ]
                #[ 7, 8, 9 ]

【讨论】:

  • 我认为可能是“和”的行为让他感到困惑。通常我们看到人们尝试“a or b in seq”;这是一段时间以来我第一次看到这里用“and”代替..
  • @DSM -- 老实说,我不得不对其进行一些测试以弄清楚实际发生了什么(例如,l1,l2 and l3 是否绑定为 (l1,l2) and l3 或者它是否绑定为 l1,(l2 and l3)。它变成第二个就是这种情况(事后看来很明显,我想)......
  • 如果有什么方法可以改进这个答案,请发表评论。我总是很乐意编辑并使事情更清晰/更正错误。
【解决方案2】:

无需使用zip,只需使用+ 运算符将它们相加即可。 l1 + l2 + l3 创建一个由l1l2l3 组合而成的新列表,因此您可以像这样简单地循环遍历它:

for f in l1+l2+l3:
    print(f)

您对and 运算符的使用不正确。您的代码不起作用的另一个原因是使用逗号(如l1, l2, l3)创建一个元组,它是一个容器,现在包含您的 3 个列表。因此,当您尝试遍历 l1, l2, l3 时,它将遍历该元组中的每个元素(即列表),而不是您想要的列表中的每个元素。

【讨论】:

    【解决方案3】:

    如果你想打印

    1 4 7
    2 5 8
    3 6 9
    

    做:

    for i,j,k in zip(l1,l2,l3):
        print i,j,k
    

    【讨论】:

      【解决方案4】:

      这取决于你想要达到的目标,

      >>> #Given
      >>> l1,l2,l3 = [1,2,3],[4,5,6],[7,8,9]
      >>> #To print row wise
      >>> import itertools
      >>> for f in itertools.chain(l1,l2,l3):
          print(f,end=" ")
      
      
      1 2 3 4 5 6 7 8 9 
      >>> #To print column wise
      >>> for f in itertools.izip(l1,l2,l3):
          print(*f,end=" ")
      
      
      1 4 7 2 5 8 3 6 9 
      >>> 
      

      或以下适用于 Python 2.7 的实现

      >>> for f in itertools.chain(*itertools.izip(l1,l2,l3)):
          print f,
      
      
      1 4 7 2 5 8 3 6 9 
      >>> 
      

      【讨论】:

        【解决方案5】:

        如果您的列表长度不同,通常最好使用map

        >>> l1 = [1, 2, 3]
        >>> l2 = [4, 5, 6]
        >>> l3 = [7, 8, 9, 2]
        >>> for x, y, z in map( None, l1, l2, l3):
        ...     print x, y, z
        ...
        1 4 7
        2 5 8
        3 6 9
        None None 2
        

        【讨论】:

        • itertools.izip_longest 就是为此目的而存在的。
        【解决方案6】:

        要扩展 Abhijit 答案,您可以使用 itertools 生成器作为列表理解中的可迭代对象。

        >>> [ n for n in itertools.chain(l1, l2, l3) ]
        [1, 2, 3, 4, 5, 6, 7, 8, 9]
        

        【讨论】:

          【解决方案7】:

          如果你的意思是你有 3 个长度相等的列表,并且你想将它们的内容打印为 3 列,那么如何 zip() 来连接列,并在每次迭代时对 print() 进行列表理解:

          [ print(row) for row in zip(l1, l2, l3) ]
          

          上面将打印元组的repr。如果您想以其他方式格式化值:

          [ print("{} / {} / {}".format(*row)) for row in zip(l1, l2, l3) ]
          

          没有人说你必须使用列表推导式的输出。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-03-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-04
            • 1970-01-01
            相关资源
            最近更新 更多