我有一个NSMutableArray,只需要对象[0:5].是否有一种简单的切片方法?可以在索引后删除所有对象吗?我可以将子数组复制到另一个NSMutableArray吗?
我正在寻找一种实现这一目标的有效方法,我认为这是一种类似切片的操作:
>>> mylist = range(100)
>>>magicslicer(mylist, 10, 20)
[0,1,2,3,4,5,6,7,8,9,30,31,32,33,34,35,36,37,38,39,60,61,62,63......,97,98,99]
Run Code Online (Sandbox Code Playgroud)
这个想法是:切片得到10个元素,然后跳过 20个元素,然后得到下一个10,然后跳过20个,依此类推.
我认为如果可能的话我不应该使用循环,因为使用切片的原因是(我猜)在单个操作中有效地进行"提取".
谢谢阅读.
据我所知,这不是正式不可能的,但通过切片访问列表的任意非顺序元素是否有"技巧"?
例如:
>>> L = range(0,101,10)
>>> L
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
Run Code Online (Sandbox Code Playgroud)
现在我希望能够做到
a,b = L[2,5]
Run Code Online (Sandbox Code Playgroud)
这样a == 20和b == 50
除了两个陈述之外的一种方式是愚蠢的:
a,b = L[2:6:3][:2]
Run Code Online (Sandbox Code Playgroud)
但这根本不会按不规则的间隔进行扩展.
也许使用列表理解使用我想要的索引?
[L[x] for x in [2,5]]
Run Code Online (Sandbox Code Playgroud)
我很想知道这个常见问题的推荐方法.
我想从切片转换固定大小的数组:
func gen(bricks []Brick) {
if len(bricks) == 16 {
if check(Sculpture{bricks}) {
var b [16]Brick = bricks[0:16];
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这会导致:
cannot use bricks[0:16] (type []Brick) as type [16]Brick in assignment
Run Code Online (Sandbox Code Playgroud)
如何将切片转换为固定大小的数组?
我正在使用Go 1.7rc3编写Go应用程序.
我有一片uint64(var dirRange []uint64),我想排序.
sort包有一个功能,sort.Ints()但它需要[]int和我一样[]uint64.
我该怎么办?我可以输入所有切片吗?
谢谢
我理解Go中数组和切片之间的区别.但我不明白的是为什么有数组是有帮助的.为什么数组类型定义指定长度和元素类型有帮助?为什么我们使用的每个"数组"都不能成为切片?
在python中有什么方法可以使用元组作为切片的索引吗?以下内容无效:
>>> a = range(20)
>>> b = (5, 12) # my slice indices
>>> a[b] # not valid
>>> a[slice(b)] # not valid
>>> a[b[0]:b[1]] # is an awkward syntax
[5, 6, 7, 8, 9, 10, 11]
>>> b1, b2 = b
>>> a[b1:b2] # looks a bit cleaner
[5, 6, 7, 8, 9, 10, 11]
Run Code Online (Sandbox Code Playgroud)
这似乎是一个合理的pythonic语法,所以我很惊讶,我不能这样做.
(更新)解决方案原来是:
>>> a[slice(*b)]
[5, 6, 7, 8, 9, 10, 11]
Run Code Online (Sandbox Code Playgroud) 作为一种特殊情况,将字符串附加到字节切片是合法的,如下所示:
slice = append([]byte("hello "), "world"...)
但我觉得我不能这样做,因为这个片段:
package main
import "fmt"
func main(){
a := []byte("hello")
s := "world"
a = append(a, s) //*Error*: can't use s(type string) as type byte in append
fmt.Printf("%s",a)
}
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
如何在不省略开始和结束切片参数的情况下反转Python字符串?
word = "hello"
reversed_word = word[::-1]
Run Code Online (Sandbox Code Playgroud)
我知道这有效,但是如何通过指定开始和结束索引来获得结果呢?
word = "hello"
reversed_word = word[?:?:-1]
Run Code Online (Sandbox Code Playgroud)
很难向学生解释为什么要word[::-1]反转弦乐.如果我能给他们逻辑推理而不是"它是pythonic方式",那就更好了.
我解释的方式word[::1]如下:"你没有指定开始,所以它只是从一开始就开始.你没有指定结束,所以直到结束.现在步骤是1所以它只是从开始到最后1个字符由1." 现在,当我的学生看到word[::-1]他们会想到"我们没有指定开头或结尾,所以它一次会经过字符串-1个字符?"
我正在研究稀疏列表实现,最近通过切片实现了赋值.这让我发现Python的内置list实现中的一些行为让我感到惊讶.
给定一个空的list和通过切片的赋值:
>>> l = []
>>> l[100:] = ['foo']
Run Code Online (Sandbox Code Playgroud)
我本来期望IndexError从list这里开始,因为实现它的方式意味着无法从指定的索引中检索项目::
>>> l[100]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)
'foo' 甚至无法从指定的切片检索:
>>> l = []
>>> l[100:] = ['foo']
>>> l[100:]
[]
Run Code Online (Sandbox Code Playgroud)
l[100:] = ['foo'] 附加到list(也就是说,l == ['foo']在此作业之后)并且看起来自BDFL的初始版本以来就表现出这种方式.我无法在任何地方找到此功能(*),但CPython和PyPy都以这种方式运行.
按索引分配会引发错误:
>>> l[100] = 'bar'
Traceback (most recent call last):
File "<stdin>", …Run Code Online (Sandbox Code Playgroud) slice ×10
python ×5
go ×4
arrays ×3
list ×3
string ×2
indexing ×1
objective-c ×1
performance ×1
python-3.x ×1
reverse ×1
tuples ×1