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

欢迎关注我的微信公众号:会有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}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容