【问题标题】:How to generate one lazy sequence from a nested for loop in Clojure如何从 Clojure 中的嵌套 for 循环生成一个惰性序列
【发布时间】:2016-01-31 22:38:11
【问题描述】:

这是一个关于如何正确收集 Clojure 中嵌套 for 循环的结果的问题。假设您要创建所有向量的序列[i j] 其中0<=j<i<4

以下代码

(for [i (range 1 4)] 
  (for [j (range i)] 
     [i j]
  )
)

生产

(([1 0]) ([2 0] [2 1]) ([3 0] [3 1] [3 2]))

但我真正想要的是

([1 0] [2 0] [2 1] [3 0] [3 1] [3 2])

这样做的正确方法是什么?

请注意,我对这个特定序列不感兴趣。我在这里的目的是学习如何从嵌套的for 循环中收集结果,我需要它来解决更复杂的问题。

【问题讨论】:

  • 仅供参考 Clojure 中的 for 与 C 或 Java 中的 for 不同。将一个 for 嵌套在另一个 for 中是相当不寻常的。 Clojure for 是一个列表理解函数,它可以帮助您创建一个列表。请参阅exemples 的 Python 列表理解。
  • 谢谢。我试过你建议的方法,它真的更干净。

标签: for-loop clojure lazy-sequences


【解决方案1】:

不要嵌套两个循环,而是使用一个循环和两个迭代器:

(for [i (range 1 4)
      j (range i)] 
   [i j])

【讨论】:

    【解决方案2】:

    假设您使用嵌套的 for 循环,apply concatpreferred way to flatten a sequence by one level

    => (apply concat 
             (for [i (range 1 4)] 
               (for [j (range i)] 
                 [i j])))
    
    ([1 0] [2 0] [2 1] [3 0] [3 1] [3 2])
    

    @Oin's solution 总是更可取,除非内循环依赖于外循环。

    【讨论】:

    • 谢谢。这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    相关资源
    最近更新 更多