标签: slice

切片整个列表和直接赋值的切片分配有什么区别?

我在许多地方看到切片赋值用于lists.当与(非默认)索引一起使用时,我能够理解它的用法,但我无法理解它的用法,如:

a_list[:] = ['foo', 'bar']
Run Code Online (Sandbox Code Playgroud)

这有什么不同

a_list = ['foo', 'bar']
Run Code Online (Sandbox Code Playgroud)

python list variable-assignment slice

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

在Golang中重新切片

我最近拿起了Go,现在我对以下代码感到困惑:

package main

import "fmt"

func main() {
    a := make([]int, 5)
    printSlice("a", a)
    b := make([]int, 0, 5)
    printSlice("b", b)
    c := b[:2]
    printSlice("c", c)
    d := c[2:5]
    printSlice("d", d)
}

func printSlice(s string, x []int) {
    fmt.Printf("%s len=%d cap=%d %v\n",
        s, len(x), cap(x), x)
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
c len=2 cap=5 [0 0] //why the capacity of c not 2 but 5 instead
d len=3 cap=3 [0 0 …
Run Code Online (Sandbox Code Playgroud)

arrays slice

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

在python中将切片转换为范围

我正在使用python3.3.我想获得一个slice对象并使用它来创建一个新range对象.

它是这样的:

>>> class A:
    def __getitem__(self, item):
        if isinstance(item, slice):
            return list(range(item.start, item.stop, item.step))

>>> a = A()
>>> a[1:5:2] # works fine
[1, 3]
>>> a[1:5] # won't work :(
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    a[1:5] # won't work :(
  File "<pyshell#9>", line 4, in __getitem__
    return list(range(item.start, item.stop, item.step))
TypeError: 'NoneType' object cannot be interpreted as an integer
Run Code Online (Sandbox Code Playgroud)

嗯,这个问题很明显 - range不接受None作为一个值:

>>> range(1, 5, …
Run Code Online (Sandbox Code Playgroud)

python range slice python-3.x

18
推荐指数
4
解决办法
6810
查看次数

扩展切片语法实际上对负步骤有什么作用?

python中的扩展切片语法已经向我解释为" a[n:m:k] returns every kth element from n to m".

这让我很清楚当k为正时会发生什么.但是我对如何解释a[n:m:k]负面k 感到迷茫.我知道这会a[::-1]颠倒一个,并且这a[::-k]需要反转a的第k个元素.

但这是对k正定义的概括呢?我想知道a[n:m:k]实际上是如何定义的,所以(例如)我可以理解为什么:

"abcd"[-1:0:-1] = "dcb"
Run Code Online (Sandbox Code Playgroud)

是否正在a[n:m:-k]逆转序列a,然后从m开始,在m之前从一个原始索引开始,然后结束一个?我不这么认为,因为这种模式不适合我尝试过的其他n和m值.但我无法弄清楚这是如何实际定义的,搜索让我无处可去.

python list syntactic-sugar slice

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

去掉memset的模拟吗?

在C++中,我可以使用memset初始化一个带有一些值的数组:

const int MAX = 1000000;
int is_prime[MAX]

memset(is_prime, 1, sizeof(is_prime))
Run Code Online (Sandbox Code Playgroud)

什么memset做的,粗略地可以被描述为填充数组有一些价值,但这样做真的非常快.

我可以这样做is_prime := make([]int, 1000000),但这将创建一个全0的切片,以我可以使用的类似方式new([1000000]int),但没有任何东西可以让我创建一个包含所有1或任何其他非零元素的数组/切片.

当然我可以使用循环用稍后的值填充它,但主要目的memset是它比循环更快.

那么Go程序员是否有memset模拟(将数组初始化为某些非零值的快速方法)?

memset go slice

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

在GO语言中删除元素并将其添加到数组中

我有2个数组声明为: var input []stringvar output []string.

输入数组最初填充了一些ID.输出数组为NULL.

每次迭代后,我想从输入数组中删除一个随机元素并将其添加到输出数组中.

最后,输出数组中的所有元素将与输入数组相同(但具有不同的排序(索引)).

for index := 0; index < len(input); index++ {
    if !visited[index] {
        //do something
    }
}
output[#iteration index] = input[current index]
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时,我明白了array out of bounds error.

arrays append go slice

18
推荐指数
2
解决办法
3万
查看次数

在Golang中解析JSON数组

简单的问题:如何使用json包解析Go中的字符串(这是一个数组)?

type JsonType struct{
    Array []string
}

func main(){
    dataJson = `["1","2","3"]`
    arr := JsonType{}
    unmarshaled := json.Unmarshal([]byte(dataJson), &arr.Array)
    log.Printf("Unmarshaled: %v", unmarshaled)
}
Run Code Online (Sandbox Code Playgroud)

arrays json go slice

18
推荐指数
2
解决办法
3万
查看次数

我可以同时写入不同的切片元素

我有一个包含要完成的工作的切片,以及在完成所有操作时将包含结果的切片.以下是我的一般过程的草图:

var results = make([]Result, len(jobs))
wg := sync.WaitGroup{}
for i, job := range jobs {
    wg.Add(1)
    go func(i int, j job) {
        defer wg.Done()
        var r Result = doWork(j)
        results[i] = r
    }(i, job)
}
wg.Wait()
// Use results
Run Code Online (Sandbox Code Playgroud)

它似乎工作,但我没有彻底测试,我不确定它是否安全.一般来说,让多个goroutine写入任何内容都不会让我感觉良好,但在这种情况下,每个goroutine都限制在切片中自己的索引,这是预先分配的.

我想替代方案是通过渠道收集结果,但由于结果顺序很重要,这似乎相当简单.以这种方式写入切片元素是否安全?

concurrency go slice goroutine

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

切片包含Unicode字符的字符串

我有一段文字,字符长度不同.

let text = "Hello ??????";
Run Code Online (Sandbox Code Playgroud)

给定开始(包含)和结束(排除)字符索引时,我需要获取一小段字符串.我试过这个

let slice = &text[start..end];
Run Code Online (Sandbox Code Playgroud)

并得到以下错误

thread 'main' panicked at 'byte index 7 is not a char boundary; it is inside '?' (bytes 6..8) of `Hello ??????`'
Run Code Online (Sandbox Code Playgroud)

我想这是因为西里尔字母是多字节的,并且[..]符号使用字节索引来表示字符.如果我想使用字符索引切片,我可以使用什么,就像我在Python中做的那样:

slice = text[start:end]

我知道我可以使用chars()迭代器并手动遍历所需的子字符串,但是有更简洁的方法吗?

string unicode slice rust

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

python切片的奇怪行为

假设我们有这个列表:

>>> a = [x for x in range(10)]
>>> print(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

另外,切片的两种方式都按预期工作:

>>> a[3:8]
[3, 4, 5, 6, 7]

>>> a[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)

但是,当合并时:

>>> a[3:8:-1]
[]
Run Code Online (Sandbox Code Playgroud)

我希望它是[7, 6, 5 ,4, 3]或者可能是[6, 5, 4, 3, 2](如果首先发生逆转)。考虑不传递startstop参数时会发生什么也很有趣:

>>> a[:5:-1]
[9, 8, 7, 6]
Run Code Online (Sandbox Code Playgroud)

这几乎是我所期望的,只有一项短。对此进行了测试numpy,它似乎以相同的方式运行。

这里发生了什么?

python list slice

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