设为首页 收藏本站
查看: 868|回复: 0

[经验分享] python元组 字典 集合

[复制链接]
发表于 2018-8-5 08:41:31 | 显示全部楼层 |阅读模式
  1.列表构建栈的数据结构:
  栈的特点:先进后出
  

#!/usr/bin/env python  
#coding:utf-8
  
stack = []
  

  
info = """
  

  栈结构
  1.入栈
  2.出栈
  3.栈长度
  4.栈顶元素
  5.退出
  

  
"""
  
print info
  

  
while 1:
  choice = raw_input("请输入你的选择:")
  

  if choice == "1":
  in_value = raw_input("入栈元素:")
  stack.append(in_value)
  print "元素%s入栈成功!" %(in_value)
  print stack
  elif choice   == "2":
  if stack:
  out_value = stack.pop()
  print "元素%s出栈成功!" %(out_value)
  print stack
  else:
  print "栈为空!"
  elif choice == "3":
  print "栈长度为%d" %(len(stack))
  elif choice == "4":
  if stack:
  print "栈顶元素为%s" %(stack[-1])
  else:
  print "栈为空"
  elif choice == "5":
  exit(0)
  else:
  print "请输入正确选择!"
  

  测试结果:
DSC0000.jpg

  2.列表构建队列的数据结构:
  队列的特点:先进先出
  

#!/usr/bin/env python  
#coding:utf-8
  
queue = []
  

  
info = """
  

  队列结构
  1.入队
  2.出队
  3.队长度
  4.队头元素
  5.队尾元素
  6.退出
  

  
"""
  
print info
  

  
while 1:
  choice = raw_input("请输入你的选择:")
  

  if choice == "1":
  in_value = raw_input("入队元素:")
  queue.append(in_value)
  print "元素%s入队成功!" % (in_value)
  print queue
  elif choice == "2":
  if queue:
  out_value = queue.pop(0)
  print "元素%s出队成功!" % (out_value)
  print queue
  else:
  print "队为空!"
  elif choice == "3":
  print "队长度为%d" % (len(queue))
  elif choice == "4":
  if queue:
  print "队头元素为%s" % (queue[0])
  else:
  print "队为空"
  elif choice == "5":
  if queue:
  print "队尾元素为%s" % (queue[-1])
  else:
  print "队为空"
  elif choice == "6":
  exit(0)
  else:
  print "请输入正确选择!"
  

  测试结果:
DSC0001.jpg

  3.Is和等于号的区别:
  字符串驻留机制:


  • 对于较小的字符串,id相同
  • 对于较长的字符串,id不相同,因为不会驻留字符串的副本。  注意:在进行测试时,一定要在交互式环境测试。
      测试:
      

      
    In [1]: a = 'hello'

  In [2]: b = 'hello'

  In [3]: print>  40886560 40886560
  In [4]: c = 'hello java world'
  In [5]: d = 'hello java world'

  In [6]: print>  40923296 40923464
  In [7]: print c is d
  False
  In [8]: e = 'python'
  In [9]: f = "".join(['p', 'y', 't', 'h', 'o', 'n'])

  In [10]: print>  140309747759888 40886608
  

  
结论:
  
Is表示的是对象标识符;表示两个变量的值是否在统一块内存空间;
  
== 表示的是值是否相等
  

  
总结: is返回值为True, ==返回一定是True;
  
深拷贝与浅拷贝:
  1. 直接赋值, 只是把新的变量指向li的内存空间, 没有复制;当li改变, li1也随之改变;
  

  In [11]: li = [1, 2, 3]
  In [12]: li1 = li

  In [13]:>  Out[13]: 40893688

  In [14]:>  Out[14]: 40893688
  

  
2. 浅拷贝: 拷贝出一份副本, 但是没有拷贝子对象(列表里面的列表对象);不完全拷贝
  
- 切片li[:]
  

  In [15]:  li1 = li[:]

  In [16]:>  Out[16]: (40893688, 40891672)


  • copy.copy()  In [17]:  li = ['fentiao', 'zhurou', ['fensi', 'fendai']]

  In [18]: li1 = li[:]

  In [19]:>  Out[19]: (40891600, 40878592)

  In [20]:>  Out[20]: (40906264, 40906264)
  In [21]: import copy
  In [22]: li2 = copy.copy(li)

  In [23]:>  Out[23]: (40891600, 40878592, 40865016)

  In [24]: >  Out[24]: (40906264, 40906264, 40906264)
  

3.深拷贝: 里面的所有对象重新拷贝, 包括子对象;  

  In [25]: li3 = copy.deepcopy(li)

  In [26]:>  Out[26]: (40906264, 40906264, 40879960)
  

元组(tuple)  
1.元组创建
  
可以把元组看作一个容器,任何数据类型都可以放在这个容器里面;
  
通过赋值方式创建元组
  

  In [27]: t = (1, 1.0, 2j, True, (1,2,3))
  In [28]: print t
  (1, 1.0, 2j, True, (1, 2, 3))
  

定义单个元组,一定要在这个元素后面加逗号  

  In [29]: t1 = (1,)
  In [30]: print type(t1)
  <type 'tuple'>
  

通过工厂方法创建元组  

  In [31]: t = tuple()
  In [32]: print type(t)
  <type 'tuple'>
  

2.元组的操作  
索引
  
切片
  
连接
  
重复
  
成员操作符
  

  
`In [33]: t = (1, 1.0, 1L, 1+2j, 'hello', [1,2])`
  
正向索引与反向索引以及元组嵌套时元素的访问
  

  In [34]: print t[0], t[-1], t[-1][-1]
  1 [1, 2] 2
  

逆转元组元素  

  In [35]:  print t[::-1]
  ([1, 2], 'hello', (1+2j), 1L, 1.0, 1)
  

连接  

  In [36]:  print t+(1,2,3)
  (1, 1.0, 1L, (1+2j), 'hello', [1, 2], 1, 2, 3)
  

  
重复
  

  In [37]: print t * 3
  (1, 1.0, 1L, (1+2j), 'hello', [1, 2], 1, 1.0, 1L, (1+2j), 'hello', [1, 2], 1, 1.0, 1L, (1+2j), 'hello', [1, 2])
  

成员操作符  

  In [38]: print 1 in t, 1 not in t
  True False
  

  
3.元组是可迭代数据类型
  

  In [41]: allow_ips = ('172.25.254.1', '172.25.254.12', '172.25.254.13')
  In [42]: for ip in allow_ips:
  ....:     print ip
  ....:
  172.25.254.1
  172.25.254.12
  172.25.254.13
  

测试练习:端口扫描器雏形  
扫描172.25.254.0/24 这个网络所有主机的ftp, ssh, http, mariadb, samba(21, 22, 80, 3306,3020)
  

  ips = []
  for i in range(1, 255):
  #ip = '172.25.254.'+str(i)
  ips.append('172.25.254.' + str(i))
  ports = (21, 22, 80, 3306, 3020)
  for ip in ips:
  for port in ports:
  print '[+] Scanning %s:%d' % (ip, port)
  

4.元组方法  
count 统计次数
  

  In [43]: t.count(1)
  Out[43]: 3
  

index 显示索引   

  In [44]: t.index(1)
  Out[44]: 0
  

元组变量交换  
python 中后面如果诗歌表达式  从右往左算
  
x,y= (2,1) #先计算右边的表达式y,x,在内存中开辟内存空间,生成元组(y,x):
  
x,y = y,x  #将x,y = (2,1)
  
print x,y
  
元组是不可变数据类型
  

  
字典
  
1.字典创建
  
字典的简单版定义1:
  

  d = {

:前面的称为键,key
  

#:后面的称为值,value  
#键值对(key-value)
  
'name': 'root',
  
'passwd':'westos'
  

  }
  print d['name']
  print d['passwd']
  

  
字典的升级版定义:
  

  info = {
  'root':{
  'name': 'root',
  'passwd':'westos',
  'age':18,
  'eamil':['westos@qq.com', 'redhat@qq.com']
  },
  

'student': {  'name': 'student',
  'passwd': 'westos',
  'age': 18,
  'eamil': ['westos@qq.com', 'redhat@qq.com']
  
},
  

  }
  print info['root']
  

  通过工厂函数创建字典
  

  

  d = dict()
  print type(d)
  d = dict(a=1, b=2, c=3)
  print d, type(d)
  

  
fromkeys方法创建字典
  
d = {}.fromkeys(['user1', 'user2', 'user3'])
  
print d
  

  
![](http://i2.51cto.com/images/blog/201803/26/7c2ea2a8bd710344c1aacda79373e5eb.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
  

  
测试练习:
  
批量生成卡号并初始化密码
  
要求描述:
  
1.生成银行卡号, 前5位为:61021 后面4位: 1~1000
  
2.并给每个银行卡初始化密码为666666
  
3. 每5个为一行
  

  

  cardids = []
  for i in range(1, 1001):
  cardid = &quot;61021%.4d&quot; % (i)
  cardids.append((cardid))
  cardInfo = {}.fromkeys(cardids, '666666')
  #print len(cardInfo)
  for i, j in enumerate(cardInfo):
  

if i % 5 == 0:  print
  
print  j,
  

测试结果:  
![](http://i2.51cto.com/images/blog/201803/26/d1885af95cc9532d3db6b5e9933e242e.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
  

  
2.字典的特性
  
不可行的特性: 索引, 切片, 连接, 重复,   (因为dict是无序的数据类型;)
  
可行的特性: 成员操作符
  
3.字典操作
  
字典值增加
  
update(key=value, .....)
  - 如果key值存在, 更新该key对应的value值;
  - 如果key不存在, 添加key-value值;
  

  In [1]: d = dict(a=1, b=2)
  In [2]: d
  Out[2]: {'a': 1, 'b': 2}
  In [3]: d.update(c=5,d=6)
  In [4]: d
  Out[4]: {'a': 1, 'b': 2, 'c': 5, 'd': 6}
  In [5]: d.update(a=10,d=100,f=9)
  In [6]: d
  Out[6]: {'a': 10, 'b': 2, 'c': 5, 'd': 100, 'f': 9}
  

setdefault(key,value)  - 如果key值存在, 不操作;
  - 如果key不存在, 添加key-value值;
  

  In [1]: d = dict(a=1, b= 2)
  In [2]: d.setdefault('a', 10)
  Out[2]: 1
  In [3]: d
  Out[3]: {'a': 1, 'b': 2}
  In [4]: d.setdefault('f', 10)
  Out[4]: 10
  In [5]: d
  Out[5]: {'a': 1, 'b': 2, 'f': 10}
  

  
字典值查看
  

  In [6]: d.keys()   #查询key值
  Out[6]: ['a', 'b', 'f']
  In [7]: d.values()   #查询values值
  Out[7]: [1, 2, 10]
  In [8]: d.items()     #查询键值对
  Out[8]: [('a', 1), ('b', 2), ('f', 10)]
  In [9]:  for i,j in d.items():
  ...:     print i,j
  ...:
  a 1
  b 2
  f 10
  In [10]: d.has_key('a') #查询字典里是否含有‘a’这个key值
  Out[10]: True
  

字典删除  pop(k[,d]):
  
- 如果key存在, 删除key-value;
  
- 如果key不存在,判断d是否存在:
  - 如果d不存在, 报错KeyError;
  - 如果d存在, 返回d;
  

  

  In [11]: d
  Out[11]: {'a': 1, 'b': 2, 'f': 10}
  In [12]: d.pop('e', 1)
  Out[12]: 1
  In [13]: d.pop('a')
  Out[13]: 1
  In [14]: d
  Out[14]: {'b': 2, 'f': 10}
  In [15]: d.pop('b', 10)
  Out[15]: 2
  

popitem():随机删除key-value对;当字典为空时报错;  

  In [19]: d
  Out[19]: {'a': 1, 'b': 2, 'c': 3, 'f': 10}
  In [20]: d.popitem()
  Out[20]: ('a', 1)
  In [21]: d
  Out[21]: {'b': 2, 'c': 3, 'f': 10}
  In [22]: del d['c']
  In [23]: d
  Out[23]:{'b': 2, 'f': 10}

In[24]:del d['c']
  KeyError                                  Traceback (most recent call last)
  <ipython-input-24-975cd7d7076f> in <module>()
  ----> 1 del d['c']
  KeyError: 'c'
  In [34]: d.clear()     #删除字典里所有元素
  In [35]: d
  Out[35]: {}
  In [36]: del d      #删除整个字典
  

  
利用if语句实现switch(实现四则运算)
  

  #!/usr/bin/env python
  #coding:utf-8
  from future import division
  while 1:
  num1 = input('Num1:')
  oper = raw_input('操作符:')
  num2 = input('Num2:')
  

if oper == "+":  print  num1 +num2
  
elif oper == '-':
  print  num1 - num2
  
elif oper == '/':
  print  num1 / num2
  
elif oper == '*':
  print  num1 * num2
  
else:
  print 'error'
  

测试结果:  
![](http://i2.51cto.com/images/blog/201803/26/11853b8377d329c7a2fd22a3f3851569.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
  

  
利用字典与函数实现switch(实现四则运算)
  

  #!/usr/bin/env python
  #coding:utf-8
  from future import division
  num1 = input('Num1:')
  oper = raw_input('操作符:')
  num2 = input('Num2:')
  def add(num1, num2):
  return num1 + num2
  def div(num1, num2):
  if num2 == 0:
  raise IOError
  else:
  return num1 / num2
  d = {
  '+': add,
  '-': num1 - num2,
  '': num1 num2,
  '/': div,
  }
  if oper in d:
  print d[oper](num1, num2)
  else:
  print 'error'
  

  
测试结果:
  
![](http://i2.51cto.com/images/blog/201803/26/6492a6613209fd1870562b76426ebc3d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
  

  
字典遍历
  

  #!/usr/bin/env python
  #coding:utf-8
  favourite_places = {
  'lee': ['xian', 'hangzhou'],
  'fentiao':['hanzhong', 'xianyang']
  }
  for name in favourite_places:
  print &quot;\n&quot; + name.title() + &quot;'s favourite place are:&quot;
  for place in favourite_places[name]:
  print place
  

  
测试结果:
  
![](http://i2.51cto.com/images/blog/201803/26/a7e27f86f13291ea930275d8a4ef16b6.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
  

  
集合:
  
集合是不重复的数据类型;字典中的key值不能重复;
  
In [37]: s = {1, 2, 3, 4, 1, 2}
  

  
In [38]: s
  
Out[38]: {1, 2, 3, 4}
  

  
列表去重
  
方法一:可以转换为集合
  

  
In [39]: li = [1, 2, 3, 4, 1, 2, 4]
  

  
In [40]: list(set(li))
  
Out[40]: [1, 2, 3, 4]
  
方法二:转化为字典,拿出所有的key; 注意: dict()不能直接将列表转化为字典;
  
In [41]: {}.fromkeys(li).keys()
  
Out[41]: [1, 2, 3, 4]
  
定义集合
  
定义一个空集合
  
In [44]: s1 = set()
  

  
In [45]: type(s1)
  
Out[45]: set
  
字典可以转化为集合
  
In [46]: d = dict(a=1, b=2, c=3)
  

  
In [47]: set(d)
  
Out[47]: {'a', 'b', 'c'}
  集合是无序的数据类型;
  
In [48]: s = {91, 2, 3, 12, 89}
  

  
In [49]: s.add(13)
  

  
In [50]: print s
  
set([2, 3, 12, 13, 89, 91])
  
集合不支持的特性: 索引, 切片, 重复,连接
  
集合支持的特性: 成员操作符
  
集合是可迭代的对象, 因此支持for循环遍历元素;
  
In [51]: s = {91, 2, 3, 12, 89}
  

  
In [52]: for i in s:
  ....:     print i
  ....:
  
91
  
89
  
2
  
3
  
12
  
集合的增删查改
  
增加
  
In [53]: s = {1, 2, 3}
  

  
In [54]: s.add(4)
  

  
In [55]: s.update({3,4,5,6})
  

  
In [56]: s.update('hello')
  

  
In [57]: s.update([1,2,37,10])
  

  
In [58]: s
  
Out[58]: {1, 2, 3, 4, 5, 6, 10, 37, 'e', 'h', 'l', 'o'}
  
删除
  
In [68]: s1.pop()
  
Out[68]: 1
  

  
In [69]: s1
  
Out[69]: {3, 4, 5}
  
In [74]: s1.remove(5)
  

  
In [75]: s1
  
Out[75]: {4}
  
In [78]: s1.discard(4)
  

  
In [79]: s1
  
Out[79]: set()
  

  
集合的交,补差集
  
In [3]: s1 = {1, 2, 3, 4}
  

  
In [4]: s2 = {1, 2, 4, 5}
  
#交集
  
In [5]: s1 & s2
  
Out[5]: {1, 2, 4}
  
#补集
  
In [6]: s1 |  s2
  
Out[6]: {1, 2, 3, 4, 5}
  
#差集
  
In [7]: s1 -  s2
  
Out[7]: {3}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-546761-1-1.html 上篇帖子: Python利用pillow判断图片完整性 下篇帖子: 项目实战_Python.利用Python+Flask编写一个高性能实时主动监控平台?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表