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

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这里有两个,包含两个空string,如果这个数组是[]int,则包含了两个0。即各自类型的零元素。  

    数组元素类型是要求一样的。

    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]

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

猜你喜欢

转载自www.cnblogs.com/zxq89/p/10685201.html