美文网首页
Python 数据结构(1) Tuple,List,dict

Python 数据结构(1) Tuple,List,dict

作者: 鹤鸣于九皋365 | 来源:发表于2017-11-16 15:02 被阅读0次

    欢迎关注我的微信公众号:会有python,tensorflow的学习教程哦~

    Tuple

    • 一旦tuple被确定就不能更改
    • 但如果元组内的对象是可变的(如列表),则可以对其进行修改
        tup=tuple(['foo',[1,2],True])
        tup[1].append(3)
        print(tup)
        >>> ('foo',[1,2,3],True)
    
    • 使用+可以扩展tuple
        a=(4,None,'foo')
        b=(6,0)
        c=('bar',)
        print(a+b+c)
        >>>(4, None, 'foo', 6, 0, 'bar')
    
    • 注意,单个元素为tuple时,后面必须加逗号。如('bar',)而不是('bar)
    • 如果将tuple赋值于和tuple结构相似的变量的表达式,python会将tuple解开,赋值于这些变量
        tup=(3,4,5)
        a,b,c=tup
        print(a,b,c)
        tup1=4,5,(6,7)
        a,b,(c,d)=tup1
        print(a,b,c,d)
        >>>3 4 5
        >>>4 5 6 7
    
    • python可以很容易的交换变量
        a,b=1,2
        print(a,b)
        a,b=b,a
        print(a,b)
        >>>1 2
        >>>2 1
    
    • 变量解包的常用操作是tuple或list中的序列迭代
        
    seq=[(1,2,3),(4,5,6),(7,8,9)]
    for a,b,c in seq:
        print('a={0},b={1},c={2}'.format(a,b,c))
    >>>
    a=1,b=2,c=3
    a=4,b=5,c=6
    a=7,b=8,c=9
    
    • 如果想取下tuple开头的部分元素,可以使用特殊的语法*rest(或*_),它可以用在函数来获取任意长参数的一个列表
    val=1,2,3,4,5
    a,b,*rest=val
    print(a,b)
    print(rest)
    >>>
    1 2
    [3, 4, 5]
    

    List

    • 增加元素list.append(1)list.insert(1,'red')。但insert计算开销大于append
    • insert的相反操作是popremove可以按值移除。如果一个list中有多个重复的元素,使用remove移除该元素时,移除第一个。
    # list()
    tup=('foo','bar','baz')
    list1=list(tup)
    print(list1)
    >>>['foo', 'bar', 'baz']
    # append()
    list1.append('dez')
    print(list1)
    >>>['foo', 'bar', 'baz', 'dez']
    #insert()
    list1.insert(1,'red')
    print(list1)
    >>>['foo', 'red', 'bar', 'baz', 'dez']
    #pop
    list1.pop(2)
    print(list1)
    >>>['foo', 'red', 'baz', 'dez']
    #remove
    list1.append('foo')
    print(list1)
    >>>['foo','red', 'baz', 'dez', 'foo']
    list1.remove('foo')
    print(list1)
    >>>['red', 'baz', 'dez', 'foo']
    
    • 如果list早已存在,可以使用extend扩展list.
    x=[4,None,'foo']
    x.extend([7,5,(2,3)])
    print(x)
    >>>[4, None, 'foo', 7, 5, (2, 3)]
    
    • enumerate

    如果不使用enumerate:

    i=0
    for val in collection:
        i+=1
    

    使用enumerate:

    for i,val in enumerate(collection):
    

    实例:

    list1=['foo','bar','baz']
    mapping={}
    for i,v in enumerate(list1):
        mapping[v]=i
    print(mapping)
    >>>{'foo': 0, 'bar': 1, 'baz': 2}
    
    • zip将list,tuple或其他序列打包成list
    list1=['foo','bar','baz']
    list2=['one','two','three']
    print(list(zip(list1,list2)))
    >>>[('foo', 'one'), ('bar', 'two'), ('baz', 'three')]
    for i,(a,b) in enumerate(zip(list1,list2)):
        print('{0}:{1},{2}'.format(i,a,b))
    >>>
    0:foo,one
    1:bar,two
    2:baz,three
    
    • 给一个“压缩”的序列,zip能用一种聪明的方式“解压”
    test=[('foo', 'one'), ('bar', 'two'), ('baz', 'three')]
    first,last=zip(*test)
    print(first)
    print(last)
    >>>
    ('foo', 'bar', 'baz')
    ('one', 'two', 'three')
    

    dict

    一些基本操作:

    #define
    empty_dict={}
    d1={'a':'value','b':[1,2,3,4]}
    print(d1)
    >>>{'a': 'value', 'b': [1, 2, 3, 4]}
    #index
    print(d1['b'])
    >>>[1, 2, 3, 4]
    #insert
    d1[7]='an integer'
    print(d1)
    >>>{'a': 'value', 'b': [1, 2, 3, 4], 7: 'an integer'}
    #del
    del d1[7]
    print(d1)
    >>>{'a': 'value', 'b': [1, 2, 3, 4]}
    #pop
    d1.pop('b')
    print(d1)
    >>>{'a': 'value'}
    #key & value
    d1={'a':'value','b':[1,2,3,4]}
    d1[7]='an integer'
    print(list(d1.keys()))
    print(list(d1.values()))
    >>>['a', 'b', 7]
    ['value', [1, 2, 3, 4], 'an integer']
    
    • 使用update合并扩展词典
    d1={'a':'value','b':[1,2,3,4],7:"an integer"}
    d1.update({'b':'foo','c':12})
    print(d1)
    >>>{'a': 'value', 'b': 'foo', 7: 'an integer', 'c': 12}
    
    • 从序列生成词典
      很常见的将两个序列生成词典的是zip:
    mapping={}
    for key,value in zip(keys,values):
        mapping[key]=value
    

    也可以这样:

    mapping=dict(zip(range(5),reversed(range(5))))
    >>>mapping
    {0:4,1:3,2:2,3:1,4:0}
    
    • 元素不在dict中的默认值
      经常是这样的写法:
    if key in some_dict:
        value=some_dict[key]
    else:
        value=default_value
    

    词典方法getpop可以返回一个默认值,上面的if-else可以简写为:

    value=some_dict.get(key,default_value)
    

    如果key不存在,get将返回None,而pop返回一个异常。

    对于设定的值,通常的情况是dict中的值为其他集合,像list。例如,可以通过首字母将将一组词根生成一个词典。

    words=['apple','bat','bar','atom','book']
    by_letter={}
    for word in words:
        letter =word[0] #获取首字母
        if letter not in by_letter:
            by_letter[letter]=[word]
        else:
            by_letter[letter].append(word)
    print(by_letter)
    >>>
    {'a': ['apple', 'atom'], 'b': ['bat', 'bar', 'book']}
    #当word在words中时,letter获得word的首字母,如果这个首字母在by_letter中,那么by_letter中以letter开头的词典就添加word这个词。如果没有这个首字母,就新建一个以word首字母开头的索引
    
    

    setdefault方法也可以实现上述的方法:

    words=['apple','bat','bar','atom','book']
    by_letter={}
    for word in words:
        letter =word[0]
        by_letter.setdefault(letter,[]).append(word)
    print(by_letter)
    #如果letter(word的首字母)在词典中,返回这个索引序列,如果不在,就新建这个序列。append根据首字母向词典中添加word
    

    python内置模块collections中有一个类defaultdict,它可以让上面的操作变得更容易

    from collections import defaultdict
    words=['apple','bat','bar','atom','book']
    by_letter=defaultdict(list)
    for word in words:
        by_letter[word[0]].append(word)
    print(by_letter)
    >>>
    defaultdict(<class 'list'>, {'a': ['apple', 'atom'], 'b': ['bat', 'bar', 'book']})
    
    • 检测dictkey类型
      可以使用hash检测一个对象是否hashable(能否在dict中充当key)
    hash('string')
    >>>5023931463650008331
    hash(1,2,(2,3))
    >>1097636502276347782
    hash((1,2,[2,3]))#fails because lists are mutable
    
    • 如果要用一个list做dict的key,就要先转成tuple
    d={}
    d[tuple([1,2,3])]=5
    print(d)
    >>>{(1,2,3):5}
    

    set

    • set(集合)

    元素是无序的,独一无二的!!

    相当于只有key没有值的dict

    • 创建set
    # way 1
    a=set([2,2,2,1,3,3])
    print(a)
    >>{1,2,3}
    # way 2
    {2,2,2,1,3,3}
    >>>{1,2,3}
    

    相关文章

      网友评论

          本文标题:Python 数据结构(1) Tuple,List,dict

          本文链接:https://www.haomeiwen.com/subject/qbblvxtx.html