Python字典实现伪切片功能


Posted in Python onOctober 28, 2020

故事是从这里开始的…

Python字典实现伪切片功能

早上起床看到一条评论,有点懵逼,字典切片?
查阅了一下Python资料,3.6版本的Python改写了dict的内部算法,3.6版本之前是无序的;
So,现在就是有序的啦,注意的是这个顺序是key的插入顺序;
但字典虽有序没下标怎么切片?list列表?
那就把key放进list里,利用list自身的截取方法切一下片!
再用截取后的key对新的字典赋值!
所以脑子一热就写了个字典切片1.0版本

# 字典切片1.0版本
def dictcut(dict, start, end):
  # 临时存放字典的key
  temp = list(dict.keys())
  # 返回一个字典
  result = {}
  #切列表里的key
  temp = temp[start:end]
  for i in range(len(temp)):
    #用切完后的key列表对新的字典赋值
    result[temp[i]] = dict.get(temp[i])
  return result
#原字典
dict = {"zero": "0", "one": "1", "two": "2", "three": "3", "four": "4"}
print("dict:", dict)
start = eval(input("起始位置:"))
end = eval(input("结束位置:"))
#调用切片方法
newdict =dictcut(dict, start, end)
print("dictcut(dict,%d,%d):" % (start, end), newdict)

然后运行结果

两个数为正,而且不越界,正常截取

Python字典实现伪切片功能

如果我想从2截取到末尾,末尾坐标是-1,但传[2 : -1]就会截取[2,-1),截取不到最后一个;那如果传[2 : 0]就会像下面一样

Python字典实现伪切片功能 

所以list[2: ]截取从2到最后一个,在传参方面就显得很麻烦了

如果截取[-5,-3]没问题,但是[-3,-5]就不行了

Python字典实现伪切片功能Python字典实现伪切片功能

综上,我希望我的字典切片可以三百六四度无死角切,从正到负,从前到后,正着切,逆着切

所以字典切片2.0版本就登场了!

# 字典切片2.0
def dictcut(dict, start, end):
  # 临时存放字典的key
  temp = list(dict.keys())
  # 返回一个字典
  result = {}
  # 分两个分支 1.start和end在可切片范围内 2.不在范围内
  if start <= len(temp) - 1 and start >= -len(temp) and end <= len(temp) - 1 and end >= -len(temp):
    #start大于end,且下标不重叠
    if start > end and start - 1 != len(temp) + end:
      #start和end同时为大于等于0
      if start >= 0 and end >= 0:
        # (4,2) 4 0 1
        for i in range(start, len(temp)):
          result[temp[i]] = dict.get(temp[i])
        for i in range(0, end):
          result[temp[i]] = dict.get(temp[i])
      # start和end同时小等于0
      if start <= 0 and end <= 0:
        # (-1,-3) 4 0 1
        for i in range(len(temp) + start, len(temp)):
          result[temp[i]] = dict.get(temp[i])
        for i in range(0, len(temp) + end):
          result[temp[i]] = dict.get(temp[i])
      # start大于0,end小于0
      if start >= 0 and end < 0:
        # (1,-2) 1 2
        for i in range(start, len(temp) + end):
          result[temp[i]] = dict.get(temp[i])

    # end大于start,且下标不重叠
    elif end > start and start + len(temp) != end - 1:
      # start和end同时为大于等于0
      if start >= 0 and end >= 0:
        # (0,3) 0 1 2
        for i in range(start, end):
          result[temp[i]] = dict.get(temp[i])
      # start和end同时大小等于0
      if start <= 0 and end <= 0:
        # (-4,-1) 1 2 3
        for i in range(len(temp) + start, len(temp) + end):
          result[temp[i]] = dict.get(temp[i])
      # end大等于0,start小于0
      if end >= 0 and start < 0:
        # (-1,3) 4 0 1 2
        for i in range(len(temp) + start, len(temp)):
          result[temp[i]] = dict.get(temp[i])
        for i in range(end):
          result[temp[i]] = dict.get(temp[i])
    #start等于end,或者下标重叠
    elif end == start or start + len(temp) == end - 1 or end <= 0 and start - 1 == len(temp) + end:
      print("切了个寂寞!")
  # start或者end不在范围内
  else:
    print("传入参数有误!")
  return result
#原字典
dict = {"zero": "0", "one": "1", "two": "2", "three": "3", "four": "4"}
print("dict:", dict)
print("字典切割:左闭右开")
start = eval(input("起始位置:"))
end = eval(input("结束位置:"))
newdict = dictcut(dict, start, end)
# 如果返回的字典不为空,打印结果
if len(newdict) != 0:
  print("dictcut(dict,%d,%d):" % (start, end), newdict)

运行结果:

若不在范围

Python字典实现伪切片功能

如果坐标重叠,重叠切个寂寞哦?

Python字典实现伪切片功能

360°无死角切切切(正常切)
正数

Python字典实现伪切片功能

负数

Python字典实现伪切片功能

360°无死角切切切(从后往前切)
正数

Python字典实现伪切片功能

负数

Python字典实现伪切片功能

2.0代码比较繁琐,但是字典切片的效果还是清晰可见的~~~

到此这篇关于Python字典实现伪切片功能的文章就介绍到这了,更多相关Python伪切片内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
在Django中限制已登录用户的访问的方法
Jul 23 Python
Python实现字典的key和values的交换
Aug 04 Python
Python开发之快速搭建自动回复微信公众号功能
Apr 22 Python
Python2随机数列生成器简单实例
Sep 04 Python
python针对excel的操作技巧
Mar 13 Python
Flask框架web开发之零基础入门
Dec 10 Python
python基础梳理(一)(推荐)
Apr 06 Python
使用python动态生成波形曲线的实现
Dec 04 Python
python实现从ftp服务器下载文件
Mar 03 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
Jun 02 Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 Python
Python实现列表索引批量删除的5种方法
Nov 16 Python
python使用selenium爬虫知乎的方法示例
Oct 28 #Python
怎么解决pycharm license Acti的方法
Oct 28 #Python
python如何快速拼接字符串
Oct 28 #Python
Python实现简单的猜单词小游戏
Oct 28 #Python
Python中openpyxl实现vlookup函数的实例
Oct 28 #Python
PyCharm最新激活码(2020/10/27全网最新)
Oct 27 #Python
Python下使用Trackbar实现绘图板
Oct 27 #Python
You might like
php foreach 参数强制类型转换的问题
2010/12/10 PHP
PHP 登录记住密码实现思路
2013/05/07 PHP
PHP使用DES进行加密与解密的方法详解
2013/06/06 PHP
php需登录的文件上传管理系统
2020/03/21 PHP
PHP设计模式之原型设计模式原理与用法分析
2018/04/25 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
javascript高亮效果的二种实现方法
2008/09/14 Javascript
JavaScript Timer实现代码
2010/02/17 Javascript
基于jQuery的自动完成插件
2011/02/03 Javascript
JavaScript打开word文档的实现代码(c#)
2012/04/16 Javascript
调用HttpHanlder的几种返回方式小结
2013/12/20 Javascript
textarea 控制输入字符字节数(示例代码)
2013/12/27 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
JS实现一个按钮的方法
2015/02/05 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
vue-cli设置css不生效的解决方法
2020/02/07 Javascript
Vue中使用better-scroll实现轮播图组件
2020/03/07 Javascript
vue keep-alive的简单总结
2021/01/25 Vue.js
Python GAE、Django导出Excel的方法
2008/11/24 Python
python利用beautifulSoup实现爬虫
2014/09/29 Python
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
Django日志及中间件模块应用案例
2020/09/10 Python
Javascript 高级手势使用介绍
2013/04/21 HTML / CSS
校园新闻广播稿
2014/01/10 职场文书
给病人的慰问信
2015/03/23 职场文书
预备党员群众意见
2015/06/01 职场文书
离婚起诉书范文2016
2015/11/26 职场文书
学校团代会开幕词
2016/03/04 职场文书