【问题标题】:In Python, is there a concise way to use a list comprehension with multiple iterators?在 Python 中,是否有一种简洁的方法来使用具有多个迭代器的列表推导?
【发布时间】:2008-12-01 02:44:03
【问题描述】:

基本上,我想在两个迭代器的“笛卡尔积”上构建一个列表理解。想想下面Haskell code

[(i,j) | i <- [1,2], j <- [1..4]]

产生

[(1,1),(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(2,4)]

能否以简洁的方式在 Python 中获得类似的行为?

【问题讨论】:

    标签: python iterator list-comprehension


    【解决方案1】:

    你是在问这个吗?

    [ (i,j) for i in range(1,3) for j in range(1,5) ]
    

    【讨论】:

      【解决方案2】:

      笛卡尔积在itertools module 中(在 2.6 中)。

      >>> import itertools
      >>> list(itertools.product(range(1, 3), range(1, 5)))
      [(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)]
      

      【讨论】:

        【解决方案3】:

        关于嵌套推导的有趣事实:它模仿嵌套的“for”循环,因此内部循环可以使用外部循环的值。这在笛卡尔积中没有用,但很高兴知道。例如:

        [ (i,j) for i in range(10) for j in range(i) ] 
        

        生成所有对 (i,j) 其中0&gt;=i&gt;j&gt;10

        【讨论】:

          【解决方案4】:

          这似乎和你描述的一样:

          [[a,b] for a in range(1,3) for b in range(1,5)]

          更新:Drat!应该在发布之前重新加载页面以查看 S.Lott 的答案。嗯……怎么做一点增值?也许是对 Python 交互模式有用性的简短证明。

          我最近来自 Perl 的背景,所以对于这样的问题,我发现在命令行中键入“python”并进入交互模式非常有帮助,然后 a) 开始尝试,b) 改进细节通过点击向上箭头并调整我之前的尝试,直到我得到我想要的。每当我对某个关键字感到模糊时,帮助就在眼前。只需输入:help("some_keyword"),阅读简要摘要,然后点击“Q”,我就可以与 python 解释器直接对话。

          如果您是初学者并且不使用它,建议您使用它。

          【讨论】:

            猜你喜欢
            • 2017-03-27
            • 2011-12-29
            • 2019-08-24
            • 1970-01-01
            • 1970-01-01
            • 2019-01-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多