【问题标题】:Python: Nested LoopPython:嵌套循环
【发布时间】:2025-12-13 16:20:05
【问题描述】:

考虑一下:

>>> a = [("one","two"), ("bad","good")]

>>> for i in a:
...     for x in i:
...         print x
... 
one
two
bad
good

如何编写这段代码,但使用如下语法:

for i in a:
    print [x for x in i]

显然,这不起作用,它会打印:

['one', 'two']
['bad', 'good']

我想要相同的输出。能做到吗?

【问题讨论】:

  • 我不太清楚你想做什么。您的第二个示例通过列表生成器有一个隐式循环。您的问题仅仅是出于美学原因,您不想让两个 for 循环相互跟随吗?
  • 就个人而言,我认为您已经拥有的循环是执行此操作的最佳方式。它简单、清晰、易读。

标签: python loops nested


【解决方案1】:
import itertools
for item in itertools.chain(("one","two"), ("bad","good")):
    print item

只需一个 for 循环即可产生所需的输出。

【讨论】:

  • 这可行,但我猜测(虽然不是肯定的)在他的真实代码中他有 n 个元组,而不是他可以硬编码的预定义集合。跨度>
  • 要了解我的意思,请阅读 tgray 的答案,使用 *a 表示法。
【解决方案2】:

不是最好的,但是:

for i in a:
    some_function([x for x in i])

def some_function(args):
    for o in args:
        print o

【讨论】:

    【解决方案3】:

    列表推导和生成器仅设计为用作表达式,而打印是一个语句。虽然你可以通过做来影响你想做的事情

    from __future__ import print_function
    for x in a:
        [print(each) for each in x]
    

    这样做非常不符合 Python 标准,并且会生成一个您实际上并不需要的列表。您可以做的最好的事情就是在原始示例中编写嵌套的 for 循环。

    【讨论】:

    • 还需要注意的是,这只适用于 Python 2.6 或 3
    • 最好使用 tgray 提供的答案而不是这个
    • 打印功能确实很棒,但是我认为有一种更好的使用方式(因此我的回答)。
    【解决方案4】:

    您需要定义自己的打印方法(或导入__future__.print_function

    def pp(x): print x
    
    for i in a:
      _ = [pp(x) for x in i]
    

    注意_ 用于指示返回的列表将被忽略。

    【讨论】:

      【解决方案5】:

      根据您的示例,您可以执行以下操作:

      a = [("one","two"), ("bad","good")]
      
      for x in sum(map(list, a), []):
          print x
      

      但是,一旦列表变大,这可能会变得很慢。

      更好的方法是 Tim Pietzcker 建议:

      from itertools import chain
      
      for x in chain(*a):
          print x
      

      使用star notation*a,允许您的列表中有n 个元组。

      【讨论】:

        【解决方案6】:

        打印功能确实更优越,但这里有一个受本杰明波拉克回答启发的更 Pythonic 的建议:

        from __future__ import print_function
        for x in a:
            print(*x, sep="\n")
        

        只需使用* 将列表 x 解包为函数的参数,并使用换行符分隔符。

        【讨论】:

          【解决方案7】:

          此代码比此处的其他解决方案简单明了:

          for i in a:
              print '\n'.join([x for x in i])
          

          【讨论】:

          • print '\n'.join(j for k in a for j in k)
          【解决方案8】:
          >>> a = [("one","two"), ("bad","good")]
          >>> print "\n".join(j for i in a for j in i)
          one
          two
          bad
          good
          
          
          
          >>> for i in a:
          ...  print "\n".join(i)
          ... 
          one
          two
          bad
          good
          

          【讨论】: