如何附加到二维切片

时间:2018-10-08 16:26:49

标签: go append 2d slice

我有按行,6列创建的数据,我不知道最终的行数。

目前,我正在创建一个200x6的全零的2D切片,然后逐行用我的数据逐渐替换这些零。数据来自另一个数据帧df

它可以工作,但我不希望以我的切片的最后几行结尾为零。我看到2个解决方案: -完成后,我只删除所有最后一行,而零 -我创建一个空切片并将数据逐步添加到其中

我尝试了各种方法,但无法弄清楚如何编写这两种解决方案中的任何一种。

当前我的代码如下:

var orders [200][6]float64  // create my 2d slice with zeros
order_line := 0

for i := start_line; i <= end_line; i++ {
    if sell_signal == "1" {
        //record line number and sold price in orders slice
        orders[order_line][1] =  float64(i+1)
        orders[order_line][2],err = strconv.ParseFloat(df[i][11], 64)
        order_line = order_line + 1
     }
}

我查看了Append命令,但尝试了各种组合以使其在2d切片上起作用,找不到适合的切片。

编辑:从下面的评论中,我了解到我实际上是在创建数组,而不是切片,并且无法将数据追加到数组。

3 个答案:

答案 0 :(得分:2)

在Golang中,切片最好代替数组。

不需要事先创建这么多行,只需在每次遍历数据以在父切片中添加新行时创建一个切片。这将帮助您仅具有所需的行数,并且无需担心长度,因为您是在父切片的索引处追加切片。

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    orders := make([][]float64, 0) // create my 2d slice with zeros
    for i := 0; i <= 6; i++ {
        value := rand.Float64()
        temp := make([]float64, 0)
        temp = append(temp, value)
        orders = append(orders, [][]float64{temp}...)
    }
    fmt.Println(orders)
}

请检查Playground上的工作代码

如果您注意到我正在循环创建一个新的temp切片,其中包含float64值,然后将值附加到我传递给父切片的临时切片中。

因此,每次我将临时切片附加到父切片时,都会创建新行。

注意:

  

数组有它们的位置,但是它们有些不灵活,所以您不必   在Go代码中经常看到它们。但是,切片无处不在。他们   建立在阵列上,以提供强大的功能和便利。

已编辑:

先处理前3列,然后再处理后3列的值,这些值将添加到临时切片中并附加到主切片中。使用以下代码逻辑:

package main

import (
    "fmt"
    "math/rand"
    "strconv"
)

func main() {
    orders := make([][]float64, 0) // create my 2d slice with zeros
    for i := 0; i <= 6; i++ {
        value := rand.Float64()
        // logic to create first 3 columns
        temp := make([]float64, 0)
        temp = append(temp, value)

        temp2 := make([]float64, 3)

        // logic to create next 3 columns on basis of previous 3 columns
        for j, value := range temp {
            addcounter, _ := strconv.ParseFloat("1", 64)
            temp2[j] = value + addcounter
        }

        temp = append(temp, temp2...)
        orders = append(orders, [][]float64{temp}...)
    }
    fmt.Println(orders)
}

工作Example

答案 1 :(得分:2)

鉴于外部容器具有未知数量的元素,内部容器恰好具有六个元素,请使用数组切片。

var orders [][6]float64
for i := start_line; i <= end_line; i++ {
    if sell_signal == "1" {
        n, err = strconv.ParseFloat(df[i][11], 64)
        if err != nil {
            // handle error
        }
        orders = append(orders, [6]float64{1: float64(i + 1), 2: n})
    }
}

此代码使用composite literal [6] float64值,而不是像问题中那样逐个元素地分配。

您可以稍后再访问[6] float64的元素。例如:

 orders[i][3] = orders[i][1] + orders[i][2]

答案 2 :(得分:1)

要获得更好的可读性和更容易的切片处理,只需创建一个struct类型并用它们填充切片。这使您可以正确地命名每个字段而不是魔术索引号,并使其更容易填写行以及以后使用。除非出于某些特殊原因对列使用数组/切片,否则这是比较惯用的Go。以下示例将用您获得的任何结果填充一个切片,而没有更多结果。

此处的完整示例:https://play.golang.org/p/mLtabqO8MNj

type Row struct {
    Thing   float64
    Data    float64
    More    float64
    Stuff   float64
    Another float64
    Number  float64
}

var rows []*Row

numResults := 15
for i := 0; i <= numResults; i++ {
    row := &Row{}
    row.Thing = 2.5
    // ... fill values
    rows = append(rows, row)
}