07 字典和集合(笔记)

来源:互联网 发布:dotamax看不到数据 编辑:程序博客网 时间:2024/05/22 09:06

1. 字典

1) dict,mapping type,并且是可变和无序的

2) key-value pair, according to the hash(key), find the corresponding address to store the value, 可见key必须是可哈希的, 例 dic[{}]=1会返回TypeError异常

所有不可变的类型都可哈希,但是一点要说明如元组,像(1,[1,2])含有可变元素不可以成为键,值相等的数字表示相同的键,如1和1.0

3) 创建字典

>>> dic={}

>>> dic["k1"]=1

>>> dic["k2"]=2

>>> dic["k3"]=3

>>> dic

{'k3': 3, 'k2': 2, 'k1': 1}

>>> dic.keys()

['k3', 'k2', 'k1']

>>> dic.values()

[3, 2, 1]

>>> dic.items()

[('k3', 3), ('k2', 2), ('k1', 1)]


构建默认词典: dic1={}.fromkeys((key1,key2,...),value)

4) 判断是词典否包含某项,可以采用{}.has_key()和in, not in

5) 我们不可以修改词典的键

6) 删除词典元素或者整个词典

>>> dic1

{'y': -1, 'x': -1}

>>> del dic1["y"]

>>> dic1

{'x': -1}

>>> dic1.clear()

>>> dic1

{}

>>> dic1["k3"]=-1

>>> dic1.pop("k3")

-1

>>> dic1

{}

>>> del dic1

>>> dic1

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

NameError: name 'dic1' is not defined

>>> dic1={"x":1}

>>> del dic1

>>> 

7) 词典不支持“+”和“*”(拼接和重复操作)

8) 词典采用词典序比较大小:

- 字典项个数

- key

- value

9) 工厂函数 dict()

>>> dict([["x",1],["y",2]])

{'y': 2, 'x': 1}

>>> dict((("x",1),("y",2)))

{'y': 2, 'x': 1}

>>> zip(("x","y"),(1,2))

[('x', 1), ('y', 2)]

>>> dict(zip(("x","y"),(1,2)))

{'y': 2, 'x': 1}


10) 词典是可变的

复习一下序列的拷贝,我们有直接赋值,切片(高层浅拷贝,不适用于词典),工厂函数(高层浅拷贝),copy函数(高层浅拷贝)和copy模块相关函数(深拷贝)等来实现,使用copy函数比用工厂函数高效

>>> dic={"x":1,"y":2}

>>> dic1=dic

>>> dic1["x"]=2

>>> dic

{'y': 2, 'x': 2}

>>> dic1=dict(dic)

>>> dic1["y"]=3

>>> dic

{'y': 2, 'x': 2}

>>> dic1=dic.copy()

>>> dic1["y"]=1

>>> dic

{'y': 2, 'x': 2}


11) 其他函数

{dict}.get(key,default),如果查找的key不存在,就返回默认值

{dict}.setdefault(key, default),如果查找的key不存在,则{key:default}会被添加到词典中

{dict}.update{dict1},将dict1的内存添加到dict中,如果dict存在相关的键,后来覆盖,不允许一个键对应多个值

sorted(dict1)

如果数据集太大,keys(), items()和values()方法的返回值都是列表不适合,此时iteritems(), iterkeys(), itervalues()被引入,返回惰性赋值的迭代器

==============================我是可爱splitter==============================

2. 集合类型

1) 集合不提供切片功能,用于存放不同的元素的集合

2) 集合分类两种类型

- 可变集合

不可哈希,所以不能作为字典的键

创建方法是set(),支持add(),remove(),discard(),pop(),clear()等函数

>>> z=set("test")

>>> z

set(['s', 'e', 't'])


>>> z.add("p")

>>> z

set(['p', 's', 'e', 't'])

>>> z.add("ad")

>>> z

set(['p', 's', 'e', 't', 'ad'])

>>> z.update("ab")

>>> z

set(['a', 'b', 'e', 'ad', 'p', 's', 't'])

>>> z.remove("ab")

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

KeyError: 'ab'

>>> z.remove("a")

>>> z

set(['b', 'e', 'ad', 'p', 's', 't'])


>>> z

set(['e', 'ad', 'p', 's', 't'])

>>> z-=set("pst")

>>> z

set(['e', 'ad'])

>>> del z

- 不可变集合

创建方法是frozenset()

>>> p=frozenset("pest")

>>> p

frozenset(['p', 's', 'e', 't'])


3) 集合操作

- 我们同样可以采用len()来获取集合的大小

- 如果operator两边是不同的类型(可变与不可变),则产生的结果类型取决于左操作数

可用于可变集合的operator:

-= 差集

|= 补集,等价于update()

&= 交集

^= XOR操作




================================Cut off=================================

练习题:

7-4

>>> dict(zip(ls,s))

{1: 'a', 2: 'b', 3: 'c'}



7-7

>>> dic1={}

>>> for key,values in dic.iteritems():

...     dic1[values]=key


7-8

>>> [(key,dic1[key]) for key in sorted(dic1)]

[('x', 3), ('y', 1), ('z', 2)]


>>> sorted(dic1.items(),key=lambda x: x[0])

[('x', 3), ('y', 1), ('z', 2)]


>>> sorted(dic1.items(),key=lambda x: x[1])

[('y', 1), ('z', 2), ('x', 3)]


7-9

#!/usr/bin/env python

from time import *

import re

import base64,hashlib


这里没有考虑GUI,tkinter等到后面来认真搞一搞

user={}

def register():

print "Here for register"

while True:

try:

name=raw_input("Username: ").lower()

except (EOFError, KeyboardInterrupt, IndexError):

exit()

if user.has_key(name):

print "the username has been taken, enter a new one"

continue

elif re.match("^[0-9a-z]+$",name) is None or len(name.split(" "))>1:

print "the username could only contain letters and digits, enter a new one"

continue

else:

break

while True:

pwd=raw_input("Password: ")

if len(pwd)<6:

print "the number of password should be no less than 6, try again"

continue

else:

break

print "Register successfully!"

user[name]=[getCrypt(pwd),0]


def getCrypt(pwd):

hash=hashlib.md5()

hash.update(pwd)

value=hash.digest()

return base64.encodestring(value)

def login():

print "Here for login"

try:

name=raw_input("Username: ").lower()

psw=getCrypt(raw_input("Password: "))

except (EOFError, KeyboardInterrupt, IndexError):

exit()

current=localtime()

if user.get(name):

upsw=user.get(name)[0]

if psw==upsw:

last=user.get(name)[1]

if last==0:

print "Welcome, my new friend, current time: <%s>"%asctime(current)

user[name][1]=current

elif current.tm_hour-last.tm_hour<4:

print "You already logged in at: <%s>"%asctime(last)

else: 

print "Welcome back, current time: <%s>"%asctime(current)

user[name][1]=current

return

print "invalid username or password"

r=raw_input("wanna register? Y or N, otherwise back to Menu: ").lower()

if r not in "yn":

r="q"

elif r=="y":

r="r"

else:

r="l"

CMDs[r]()

def manage():

print """

(D)elete

(S)howuser

(Q)uit

"""

Done=True

while Done:

try:

op=raw_input("Enter your choice: ").lower()

except (EOFError, KeyboardInterrupt, IndexError):

exit()

if op in "dsq":

Done=False;

CMDs[op]()

if Done==True:

print "Invalid input, try again"


def deluser():

try:

name=raw_input("Enter the username you wanna delete: ").lower()

except (EOFError, KeyboardInterrupt, IndexError):

exit()

if user.has_key(name):

del user[name]

print "The user has been removed"

else:

print "The user doesn't exit, nothing changed"


def showuser():

for key, value in sorted(user.iteritems()):

print key, value


#CMDs={"r":register,"l":login,"m":manage,"d":deluser,"s":showuser}


def showmenu():

while True:

print """

(R)egister

(L)ogin

(M)anage

(E)xit

"""

Done=True

while Done:

try:

op=raw_input("Enter you choice: ").lower()

except (EOFError, KeyboardInterrupt, IndexError):

exit()

if op in "rlme":

Done=False

CMDs[op]()

if Done==True:

print "Invaid input, try again"


CMDs={"r":register,"l":login,"m":manage,"d":deluser,"s":showuser,"e":exit,"q":showmenu}

if __name__=="__main__":

showmenu()


Reference:

1. Python核心编程 Ver3.0










0 0
原创粉丝点击