当前位置: 首页 > 面试题库 >

切片迭代顺序

越开畅
2023-03-14
问题内容

好的,我认为这可能是一个老问题,但是我在stackoverflow上没有发现任何东西。在go中,不保证地图上的迭代顺序是可重现的。因此,建议的方法是将键保留在一个切片中并对该切片进行排序。然后,对该切片进行迭代以从映射中检索值,以便我们按顺序获取它们(因为由键组成的切片已排序,因此将以可再现的顺序排列)。因此,这意味着需要对切片进行排序,否则切片上的迭代也不会给出可重现的顺序。但是,当我在操场上尝试以下代码时,总是会发现迭代中保持了顺序,然后在地图迭代的情况下,为什么需要对键片进行排序?

func main() {
    var mySlice = make([]string, 0)
    mySlice = append(mySlice, "abcd")
    mySlice = append(mySlice, "efgh")
    mySlice = append(mySlice, "ijkl")
    mySlice = append(mySlice, "mnop")
    mySlice = append(mySlice, "qrst")
    mySlice = append(mySlice, "uvwxyz")
    for _, val := range mySlice {
        fmt.Println(val)
    }
    fmt.Println(strings.Join(mySlice, "|"))

}

输出:

abcd
efgh
ijkl
mnop
qrst
uvwxyz
abcd|efgh|ijkl|mnop|qrst|uvwxyz

问题答案:

切片排序的唯一原因是因为您要按已排序的顺序附加项目。如果您按这样的未排序顺序附加项目

var mySlice = make([]string, 0)
mySlice = append(mySlice, "mnop")
mySlice = append(mySlice, "efgh")
mySlice = append(mySlice, "uvwxyz")
mySlice = append(mySlice, "ijkl")
mySlice = append(mySlice, "abcd")
mySlice = append(mySlice, "qrst")

(或通过从映射中拉出键填充切片,这将是未排序的),则迭代的顺序将是未排序的(一致,是,但始终未排序)。因此,如果您的目标是使用切片按排序顺序从地图中提取项目,则需要首先对切片进行排序,除非可以保证切片项目已按已排序的顺序插入。



 类似资料:
  • 问题 你想得到一个由迭代器生成的切片对象,但是标准切片操作并不能做到。 解决方案 函数 itertools.islice() 正好适用于在迭代器和生成器上做切片操作。比如: >>> def count(n): ... while True: ... yield n ... n += 1 ... >>> c = count(0) >>> c[10:20] Tr

  • 本文向大家介绍Python进阶之迭代器与迭代器切片教程,包括了Python进阶之迭代器与迭代器切片教程的使用技巧和注意事项,需要的朋友参考一下 在前两篇关于 Python 切片的文章中,我们学习了切片的基础用法、高级用法、使用误区,以及自定义对象如何实现切片用法(相关链接见文末)。本文是切片系列的第三篇,主要内容是迭代器切片。 迭代器是 Python 中独特的一种高级特性,而切片也是一种高级特性,

  • 问题内容: 我想遍历一个迭代器的“切片”。我不确定这样做是否可行,因为据我了解,无法切片迭代器。我想做的是这样的: 这当然会失败: 有没有一种pythonic的方法可以循环通过生成器的“切片”? 基本上,我实际上关心的生成器读取一个很大的文件,并逐行对其执行一些操作。我想测试文件的片段以确保一切正常,但是让它在整个文件上运行非常耗时。 编辑: 如前所述,我需要在文件上执行此操作。我希望有一种方法可

  • 问题内容: 我试图遍历slice值并更新一个或多个值,通过索引访问它或遍历它们。然后我有以下问题。 然后我得到以下错误: 问题答案: 类型不支持索引,类型不支持。 http://play.golang.org/p/_26TUBHdDm

  • 问题 你有一系列排序序列,想将它们合并后得到一个排序序列并在上面迭代遍历。 解决方案 heapq.merge() 函数可以帮你解决这个问题。比如: >>> import heapq >>> a = [1, 4, 7, 10] >>> b = [2, 5, 6, 11] >>> for c in heapq.merge(a, b): ... print(c) ... 1 2 4 5 6 7

  • 问题内容: 我写了这段代码,它将一个小写的英语短语翻译成猪拉丁。 但是,它对短语中的最后一个单词没有任何作用。 如果我使用“快速的棕色狐狸跳过懒狗”这句话,我会得到“ ethay uickqayownbray oxfay umpedjay overay ethay azylay狗” 这里的一切都正确,除了硬道理!为什么不起作用?如果我使用“ hello world”作为短语,也会发生同样的事情。