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

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

Python 数据结构(1) Tuple,List,dict_第1张图片

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(, {'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)