不确定在构造延迟序列时使用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中的代码的(有限的)理解建议不然.
假设我有一个包含(以及其他)不同类型的子列表的列表:
[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)
我目前的解决方案是一个功能,但仅仅是出于我的求知欲,我想知道是否可以用一个列表理解来做到这一点?
在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) 我正在解析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的节点.我想在同一个集合中抓取每个节点,无论深度如何,然后过滤我需要的东西.
我有一个巨大的多维数组,我想转换成一个单维数组,真正的问题是数组是动态的,它可以是一个很深的,因为它想要,我不能提前确定它.在这里发布一个例子
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) 我想做这样的事情:
[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) 我前段时间也问过类似的问题。有人问我怎样才能变成这样的数组:
[[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阵列进行此操作必须更简单。
我正在使用该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) 在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应该如何与泛型一起使用?
猫是否能提供类似于
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类似开箱即用的扩展方法,该方法仅返回权限而不是元组?