标签: flatten

Clojure压扁和懒惰

不确定在构造延迟序列时使用flatten时我观察到的行为是什么.

查看clojure.core中的源代码,我可以看到flatten函数调用filter,因此应该返回一个惰性序列 - 我想.但是下面的代码片段给了我一个stackoverflow错误.在使用对concat的调用替换对flatten的调用的代码段中,它工作得很好

(defn l-f [c]
  (if (nil? c) []
    (lazy-seq  (flatten (cons  [[ :h :j] :a :B] (l-f (rest c))))))) 


    (take 10 (l-f (repeat 2))) is how I invoke it.
Run Code Online (Sandbox Code Playgroud)

这是一个相当人为的例子.我也知道flatten和concat会给我一些嵌套级别不同的序列.

我试图找出为什么flatten似乎打破了懒惰,即使我对clojure.core中的代码的(有限的)理解建议不然.

clojure lazy-evaluation flatten

2
推荐指数
1
解决办法
930
查看次数

选择性展平Python列表

假设我有一个包含(以及其他)不同类型的子列表的列表:

[1, 2, [3, 4], {5, 6}]
Run Code Online (Sandbox Code Playgroud)

我想以一种选择性的方式扁平化,这取决于它的元素类型(即我只想展平sets,其余部分不平整):

[1, 2, [3, 4], 5, 6]
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案是一个功能,但仅仅是出于我的求知欲,我想知道是否可以用一个列表理解来做到这一点?

python list-comprehension list flatten

2
推荐指数
1
解决办法
201
查看次数

如何解决Scala 2.10.x flatten问题

在Scala 2.10.3中,我看到了这个问题.

Welcome to Scala version 2.10.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.


scala> val list = List(1, 2, List(5, 6))
list: List[Any] = List(1, 2, List(5, 6))

scala> list.flatten
<console>:9: error: No implicit view available from Any => scala.collection.GenTraversableOnce[B].
           list.flatten
                ^
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

我目前的解决方法是定义我自己的平面功能.

def flat(list: List[Any]): List[Any] = list flatten {
  case i: List[Any] => flat(i)
  case e => List(e)
}

scala> flat(list)
res2: List[Any] = …
Run Code Online (Sandbox Code Playgroud)

scala flatten scala-2.10

2
推荐指数
2
解决办法
6707
查看次数

SelectMany以展平嵌套结构

我正在解析XML结构,我的类看起来像如下:

class MyXml
{
    //...

    List<Node> Content { get; set; }

    //...
}

class Node
{
    // ...

    public List<Node> Nodes { get; set; }
    public string Type { get; set; }

    //...
}
Run Code Online (Sandbox Code Playgroud)

MyXml表示我正在解析的XML文件,其元素都被调用<node>.每个节点都有一个type属性,可以有不同的值.

节点的类型未与其深度相关联.我可以在任何深度级别拥有任何节点类型.

我可以正确地解析结构,所以我得到一个与myXML对象,其内容为节点,即列表中曾经节点可以有子节点等等(我用递归为)的列表.

我需要做的是展平整个结构并仅提取某种类型的节点.

我尝试过:

var query = MyXml.Content.SelectMany(n => n.Nodes);
Run Code Online (Sandbox Code Playgroud)

但它只采用结构深度为1的节点.我想在同一个集合中抓取每个节点,无论深度如何,然后过滤我需要的东西.

c# linq list flatten

2
推荐指数
1
解决办法
2914
查看次数

如何将深度多维数组转换为单维数组 - Javascript

我有一个巨大的多维数组,我想转换成一个单维数组,真正的问题是数组是动态的,它可以是一个很深的,因为它想要,我不能提前确定它.在这里发布一个例子

    var myArray =   [
        "hello", 
        ["berries", "grouped", 88, "frozen"], 
        [
            "stuff", 
            [
                "mash", 
                ["melon", "freeze", 12, "together"], 
                "people"
            ], 
            "car"
        ], 
        [
            "orange", 
            "code", 
            84, 
            ["mate", "women", "man"]
        ], 
        ["bus", "car", 345, "lorry"], 
        "world"
    ];
Run Code Online (Sandbox Code Playgroud)

它应该转换为单维数组

["hello","berries","grouped",88,"frozen","stuff","....."]
Run Code Online (Sandbox Code Playgroud)

javascript flatten

2
推荐指数
1
解决办法
79
查看次数

如何将数组添加到字符串而不在JS中展平它们?

我想做这样的事情:

[1,[2],[3,4]] + " is a Nested Array." => "[1,[2],[3,4]] is a Nested Array."

但是, console.log([1,[2],[3,4]] + " is a Nested Array."); 给出1,2,3,4 is a Nested Array.

我可以通过在字符串中添加方括号并使数组变平来实现单维数组:

 "["+ [1,2,3,4,5] + "] is a single dimensional array." 
      => "[1,2,3,4,5] is a single dimensional array."
Run Code Online (Sandbox Code Playgroud)

javascript arrays string flatten

2
推荐指数
1
解决办法
74
查看次数

如何更快速地转置数组?

我前段时间也问过类似的问题。有人问我怎样才能变成这样的数组:

[[1,2,3],[4,5,6],[7,8,9]]
Run Code Online (Sandbox Code Playgroud)

对此:

[1,2,3,4,5,6,7,8,9]
Run Code Online (Sandbox Code Playgroud)

但是现在我想把相同的数组变成这个:

[1,4,7,2,5,8,3,6,9]
Run Code Online (Sandbox Code Playgroud)

假设所有子数组具有相同的长度。

如果您尚未注意到,结果中的前三项就是这三个子数组中的第一项。结果中的第四,第五和第六项是每个子数组的第二项。

如果您仍然不了解,也许这会有所帮助:

原始数组:

[
    [1,2,3],
    [4,5,6],
    [7,8,9]
]
Run Code Online (Sandbox Code Playgroud)

结果:

[
    1,4,7,
    2,5,8,
    3,6,9
]
Run Code Online (Sandbox Code Playgroud)

此刻,我有这个:

func flatten(array: [[Int]]) -> [Int] {
    var flat = [Int]()
    for i in 0..<array[0].count {
        for subarray in array {
            flat.append(subarray[i])
        }
    }
    return flat
}
Run Code Online (Sandbox Code Playgroud)

我不认为这很花哨。如何快速进行此操作?

为了避免成为XY问题,这就是我要这样做的原因。

我正在开发一个棋盘游戏。我正在使用HLSpriteKit中的棋盘游戏HLGridNode(基本上是一堆正方形的网格状布局)。要编辑网格节点的内容,我需要传递一个Sprite节点的1D数组,而不是2D数组。

为了使生活更轻松,我将模型对象存储在2D数组中。这样,我可以通过以下操作从左边引用5个正方形,从顶部引用2个正方形:

modelObjects[5][2]
Run Code Online (Sandbox Code Playgroud)

如果我使用展平2D数组.flatMap { $0 }并将结果传递到网格节点,则它modelObjects[5][2]看起来将是从左侧2个正方形和从顶部5个正方形。

这不是重复这个,因为这个问题似乎有数组与工作的明确的数量。尽管我可以将2D数组放入一个循环中并执行这些操作enumerate().map {...},但这似乎是一个漫长的过程。我认为使用2D阵列进行此操作必须更简单。

flatten multidimensional-array swift

2
推荐指数
1
解决办法
439
查看次数

在R中展平或取消列出数据框

我正在使用该Googleway软件包获取一堆lat长坐标的高程信息,其总共有954个.

我将调用分成3个单独的文件,但它们是列表格式,当我将它们转换为数据帧时,它们是嵌套的数据帧格式.我一直试图压扁文件并取消列出,但我没有成功.

DF <- read.csv("Site Coor R.csv", header = T, colClasses = c("numeric","numeric"))

result1 <- google_elevation(df_locations = DF[1:350,], key = "KEY")
result2 <- google_elevation(df_locations = DF[351:700,], key = "KEY")
result3 <- google_elevation(df_locations = DF[701:954,], key = "KEY")

> str(result1)
List of 2
 $ results:'data.frame':    350 obs. of  3 variables:
  ..$ elevation : num [1:350] 14.15 2.14 2.66 6.78 23.27 ...
  ..$ location  :'data.frame':  350 obs. of  2 variables:
  .. ..$ lat: num [1:350] 52.7 52.7 52.7 52.9 52.7 …
Run Code Online (Sandbox Code Playgroud)

r flatten dataframe googleway

2
推荐指数
1
解决办法
1534
查看次数

F#Option.flatten错误,无

在Option模块上应用flatten功能时出错:

let flatten  =
function
| None          -> None
| Some innerOpt -> innerOpt
Run Code Online (Sandbox Code Playgroud)

这只适用于像以下那样的imputs:但是如果输入为"None",那么我会收到此错误:

flatten None 

error FS0030: Value restriction. The value 'it' has been inferred to have generic type
    val it : '_a option
Either define 'it' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation.
Run Code Online (Sandbox Code Playgroud)

在None情况下,flatten应该如何与泛型一起使用?

f# options flatten

2
推荐指数
1
解决办法
386
查看次数

将列表[[[A,B]之一]扁平化到列表[B],像列表[Option [B]]扁平化到列表[B]

猫是否能提供类似于

implicit class FlattenListOfEither[L, R](l: List[Either[L, R]]) {
  def flattenM: List[R] = l collect { case Right(v) => v }
}
Run Code Online (Sandbox Code Playgroud)

这样

val l1: List[Either[String, Int]] = List(Right(1), Right(2), Left("error"), Right(4))
l1.flattenM
Run Code Online (Sandbox Code Playgroud)

输出

List(1, 2, 4)
Run Code Online (Sandbox Code Playgroud)

类似于Vanilla Scala展平选项列表的方式

val l2: List[Option[Int]] = List(Some(1), Some(2), None, Some(4))
l2.flatten
Run Code Online (Sandbox Code Playgroud)

哪个输出

List(1, 2, 4)
Run Code Online (Sandbox Code Playgroud)

separate 提供以下语法

import cats.implicits._
val (_, rights) = l1.separate
rights
Run Code Online (Sandbox Code Playgroud)

哪个输出

List(1, 2, 4)
Run Code Online (Sandbox Code Playgroud)

但是,是否存在flatten类似开箱即用的扩展方法,该方法仅返回权限而不是元组?

scala flatten either scala-cats

2
推荐指数
1
解决办法
119
查看次数