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
- 07 字典和集合(笔记)
- (4)集合和字典
- Swift集合类型(数组和字典)
- Swift集合类型(数组和字典)
- Python--映像和集合类型(字典)
- python字典和集合
- 集合类和字典
- Python字典和集合
- 字典和集合
- Python字典和集合
- Python字典和集合
- **PYTHON** 字典和集合
- Python字典和集合
- Python 学习笔记 -- 变量、元组、列表、字典和集合
- <PY><core python programming笔记>C7 字典和集合类型
- Python学习笔记7:Python字典和集合
- 02-python学习笔记:字典dict和集合set
- python核心编程笔记(6)- 字典,集合
- String 常用方法最优算法实现总结 (一)
- gradle 混淆出错
- SAT要求多少词汇量?
- ElasticSearch NEST
- SpringMVC整合Quartz实现定时任务---简单的例子
- 07 字典和集合(笔记)
- UML
- UFLDL(新版)中文翻译——Supervised Learning and Optimization: Linear Regression
- 001 Ability
- Android27_OptionsMenu、ContextMenu及PopupWindow自定义菜单
- 非常好的highcharts学习地址
- ios中 继承对象模型的归档实现
- 最全SpringMVC详细示例实战教程
- 单词计数程序在hadoop上的实现