我在许多地方看到切片赋值用于lists.当与(非默认)索引一起使用时,我能够理解它的用法,但我无法理解它的用法,如:
a_list[:] = ['foo', 'bar']
Run Code Online (Sandbox Code Playgroud)
这有什么不同
a_list = ['foo', 'bar']
Run Code Online (Sandbox Code Playgroud)
?
我最近拿起了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) 我正在使用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中的扩展切片语法已经向我解释为" 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值.但我无法弄清楚这是如何实际定义的,搜索让我无处可去.
在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模拟(将数组初始化为某些非零值的快速方法)?
我有2个数组声明为:
var input []string和var 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.
简单的问题:如何使用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) 我有一个包含要完成的工作的切片,以及在完成所有操作时将包含结果的切片.以下是我的一般过程的草图:
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都限制在切片中自己的索引,这是预先分配的.
我想替代方案是通过渠道收集结果,但由于结果顺序很重要,这似乎相当简单.以这种方式写入切片元素是否安全?
我有一段文字,字符长度不同.
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()迭代器并手动遍历所需的子字符串,但是有更简洁的方法吗?
假设我们有这个列表:
>>> 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](如果首先发生逆转)。考虑不传递start或stop参数时会发生什么也很有趣:
>>> a[:5:-1]
[9, 8, 7, 6]
Run Code Online (Sandbox Code Playgroud)
这几乎是我所期望的,只有一项短。对此进行了测试numpy,它似乎以相同的方式运行。
这里发生了什么?