Как добавить в 2d срез - PullRequest
       40

Как добавить в 2d срез

0 голосов
/ 08 октября 2018

У меня есть данные, которые создаются строк за строками, 6 столбцов, я не знаю заранее конечное количество строк.

В настоящее время я создаю 2D-срез 200x6 со всеми нулями, а затемя постепенно заменяю эти нули своими данными, строка за строкой.Данные поступают с другого фрейма данных df

. Это работает, но мне не нравится заканчивать последними строками моего среза, заполненного нулями.Я вижу 2 решения: - Я удаляю все последние строки только с нулями, когда я закончу - я создаю пустой срез и постепенно добавляю к нему свои данные

Я пробовал разные вещи, но не мог понять, какзакодируйте любое из этих 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срез, не могу найти тот, который работает.

edit: из комментариев ниже я понимаю, что на самом деле я создаю массив, а не срез, и нет способа добавить данные в массив.

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

В 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)
}

Пожалуйста, проверьте рабочий код на Детская площадка

Если вы заметили, что я создаю новый цикл 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)
}

Рабочая Пример

0 голосов
/ 08 октября 2018

Учитывая, что внешний контейнер имеет неизвестное количество элементов, а внутренний контейнер содержит ровно шесть элементов, используйте фрагмент массива.

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})
    }
}

В этом коде используется составной литерал [6] Значение float64 вместо присвоения элемента элементу, как в вопросе.

Вы можете вернуться и получить доступ к элементам [6] float64 позже.Например:

 orders[i][3] = orders[i][1] + orders[i][2]
0 голосов
/ 08 октября 2018

Для лучшей читаемости и упрощения обработки срезов, просто создайте тип структуры и заполните им срез.Это позволяет вам правильно называть каждое поле вместо магических номеров и упрощает заполнение строк, а также их использование позже.Если нет какой-либо конкретной причины использовать массивы / срезы для столбцов, это более идиоматичный 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)
}
...