欢迎关注我的微信公众号:会有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
的相反操作是pop
。remove
可以按值移除。如果一个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
词典方法get
和pop
可以返回一个默认值,上面的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']})
- 检测
dict
的key
类型
可以使用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}