python,golang的几种数据集合类型(一)

2 阅读4分钟

python里面有:

1)list 数组

  slice 切片

2)tuple  元组

3)dict  字典

4)set  集合

golang的:

1)array 数组

  slice 切片

2)没有元组

3)map 字典

4)没有基础类型的set

 

综上,两者都有的:数组,字典

1.数组

1) python:

a)  python中数组是list,可以直接使用一对[ ]括起来的数据来初始化,或者初始化一个空的数组:

    1 >>> a=[]
    2 >>> b=["aa","bb","cc"]

甚至数组中元素可以类型不一样O__O "…


     1 >>> c=["aa","bb",123]
     2 >>> len(c)
     3 3
     4 >>> type(c)
     5 <type 'list'>
     6 >>> type(c[0])
     7 <type 'str'>
     8 >>> type(c[1])
     9 <type 'str'>
    10 >>> type(c[2])
    11 <type 'int'>

b)  访问元素,可以下标(溢出会报错,下标可以是负数):

    1 >>> b[0]
    2 'aa'
    3 >>> c[2]
    4 123
    5 >>> c[3]
    6 Traceback (most recent call last):
    7   File "<stdin>", line 1, in <module>
    8 IndexError: list index out of range

或者遍历:

    1 for val in c:
    2     print val
    3 #或者
    4 for idx, val in enumerate(c):
    5     print idx,val

也可以使用c.index(obj),返回的是list里面的第一个值为obj的索引(下标)    

c)  追加、修改元素。注意追加(append)的时候,参数是元素,如果是追加另一个list,那么要使用newlist=a+xxx或者a.extend(xxx),前者是两个list拼接,后者是把xxx追加到a,据说前者效率高些。appned()的参数如果是list,那么这个list会作为元素插入原来list的末尾:

    1 >>> a=["11"]
    2 >>> a.append("abc")
    3 >>> a.append(123)
    4 >>> a[0]=111
    5 >>> print a
    6 [111, 'abc', 123]

遍历里面的修改:

    1 c=["aa","bb",123]
    2 for idx, val in enumerate(c):
    3     if idx == 1:
    4         val="1"   #不能修改数组里面的值
    5     if idx == 2:
    6         c[idx]="2"  #修改数组里面的值
    7 print c
    8 #输出:['aa', 'bb', '2']

d)  插入元素也可以用c.insert(idx,val)会在下标为idx(如果是负数,则是逆序的下标,从-1开始)的位置插入这个val,其他的依次后移。虽然不清楚python中list的底部实现,但是如果是数组,这样操作的效率应该不会很高,不是很推荐。

e)  删除元素 del c[idx]

python中的切片(slice):

  切片是构建在数组上的概念。原来我总是理解不了,“切片”,从字面上看完全理解不了,接受不了。后来觉得可以理解为数组的的取值器,大概可以想象一个数组就是一个轨道,切片是滑动在轨道上的一个框,框出数组的一部分。

    1 >>> a=[1,2,3,4,5,6]
    2 >>> b=a[2:5]
    3 >>> print b
    4 [3, 4, 5]

  a[start:end] 就是取 [start,end)这个区间的元素,start,end是下标。就是说包含start,但是不包含end,即start~(end-1)。上面的例子就是取下标为2,3,4的元素。

  如果start >= end,取出来的就是空数组。

  start是可以负数,数组的最后一个值下标是-1.往前一个是-2,以此类推。

  start或者end可以为空,为空就是不设限。

  除了start和end,还有个步长的参数。这个感觉用的不多,不过步长设为-1,即[::-1],就是反转数组,这个挺有用。

  简单来说,如果切片当做一个滑动框,那么这个框随意滑,能框到数据就返回数据,框不到数据,就返回空数组。左右边框可以给任意的下标值,正数就从数组的0下标开始计;负数就从数组的最大下标开始,计为-1。而且,左边框的下标要包含,有边框的下标不包含。    

2) golang:

a)  golang中的数组,初始化:

    1     a := []string{"1","2"}
    2     var b []string
    3     c := []string{}
    4     d := make([]string,2)

  其中,make这种方式,创建的是一个包含元素的数组。比如d这里有两个元素,两个空的字符串。如果这个数组是[]int,则包含了两个0。即各自类型的零元素。  

  数组元素类型是要求一样的,这个和python不一样。

b)  访问元素,下标(溢出会报错,而且下标必须不能是负数),遍历:

    1     a := []string{"1","2","3","4"}
    2     for idx, val := range a {
    3         fmt.Println(idx, val)
    4     }

c)  追加、修改元素:

    1 a = append(a, "abc")
    2 a[2] = "new2"

d)  插入元素,好像没有。。当然,可以通过slice切分,在数组中间append一个值,再把数组后半段append回去。总之,对数组的插入元素,不是好的做法。

e)  删除元素,好像也没有。。同样,在数组中间删除元素也不推荐。

golang中的切片(slice):

  我觉得golang中的切片和python可以一样理解。

        m := []string{"a","b","c","d","e"}
        m1 := m[2:3]
        // m1=["c"]

  m[start:end],同样是[start,end)区间。不过golang里面不支持负数的下标,也不支持步长。必须start<=end.否则报错。感觉其他没啥区别。

【迁移】(www.cnblogs.com/zxq89/p/106… "发布于 2019-04-12 16:55")