字符串转换tuple对象

给定“前导空格分隔的元组字符串”,还原成合法的python元组tuple对象。


(笔记模板由python脚本于2023年12月29日 19:29:03创建,本篇笔记适合熟悉Python元组tuple的coder翻阅)


【学习的细节是欢悦的历程】

  • Python 官网:https://www.python.org/

  • Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
    地址:https://lqpybook.readthedocs.io/


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


  • My CSDN主页、My HOT博、My Python 学习个人备忘录
  • 好文力荐、 老齐教室
等风来,不如追风去……


将“前导空格分隔的元组字符串”
字符串转换tuple对象
(还原“另类元组”成python元组tuple对象)


本文质量分:

97

本文地址: https://blog.csdn.net/m0_57158496/article/details/135297494

CSDN质量分查询入口:http://www.csdn.net/qc


目 录

  • ◆ 字符串转换tuple对象
    • 1、题目描述
    • 2、算法解析
      • 2.1 输出格式错误修正
      • 2.2 字符串转换tuple对象
      • 2.3 下标索引嵌套tuple元素
    • 3、完整源码(Python)


◆ 字符串转换tuple对象


1、题目描述


  • 题目描述截屏图片
    在这里插入图片描述
    题目来源于 CSDN 问答社区提问“PTA: Tuple (python)”



回页目录


2、算法解析


  本题目关键点在于,将另类的“元组”输入字符串,搞成它在python中的样子!我是想得黔驴技穷的时候,才构造好“算法”的。代码的调试,也花了我不少时光。😊😊(截屏图片后面是用题目中的两个样例对我“造”的“str to tuple”函数reTuple的试炼效果。😉😉)

  本来打算直接用eval函数来把题目给出的“元组”转换成python对象,奈何题目刁钻的把元组的第一个元素包括元组关键字圆括号都全部加上了前导空格,eval也对它望洋“符”叹,无能为力。

  设想多种“解决方案”未果,我决定从tuple对象在python中的样貌入手,借助python现在最是推崇的“插值字符串格式化”语法糖来“还原”元组本来面目。本以为顺风顺水很好搞,结果也是满路荆棘,迷雾重重。最后在“复杂”if语句的助攻下,完成了tuple相貌字符串的“还原”,再通过eval的打扮,才得以回复它的先前模样。

  至此,下标索引引用及引用溢出的处理,就一马平川了。当eval抛出的异常信时,拦截并返回“ERROR”字符串就好。


  如有必要,继续浏览后面内容,您且给点耐心听我一一拆解👀


  • 代码运行效果截屏图片
    在这里插入图片描述
      输出的第三行,格式是不对的,我的粗心大意让我出错。谢谢题主给指正,我才得以在整理成学习笔记时修正。



回页目录


2.1 输出格式错误修正


  谢谢题主给指正,我才得以在整理成学习笔记时修正。


  • 与题主对话截屏图片
    在这里插入图片描述
      我写了单行匿名函数tupleToStr,修正输出格式错误:

      如果是tuple,则搞成题目样例输入那样的“元组”。

单行匿名函数tupleToStr


tupleToStr = lambda x: x if type(x) != tuple else f"( {' '.join(map(str, x))} )" # 如果是tuple,则搞成题目样例输入那样的“元组”。
#input(tupleToStr((5, 6, 7))) # 函数试炼语句。



回页目录


2.2 字符串转换tuple对象


  还原元组字符串成tuple样貌:我用元组在python中的字符串表现形式入手“还原”的,用if语句添加应有的半角逗号。


  • 最初写法
    饶舌复杂,差点把我自己都绕晕。
    lis[i].isdigit() and (lis[i-1].isdigit() or lis[i-1] == ‘)’),当前字符是数字,前一字符是数字或者后半个圆括号;或者lis[i] == ‘(’ and lis[i-1].isdigit(),前半边前一字符是数字;或者lis[i] == ‘(’ and lis[-1] == ‘)’,前半边圆括号前是后半边圆括号。
        if lis[i].isdigit() and (lis[i-1].isdigit() or lis[i-1] == ')') or (lis[i] == '(' and lis[i-1].isdigit()) or (lis[i] == '(' and lis[-1] == ')'): # 饶舌复杂,差点把我自己都绕晕。
  • 简单优化
    条理稍微清晰,两个嵌套if。
    lis[i].isdigit() and (lis[i-1].isdigit() or lis[i-1] == ‘)’)lis[i] == ‘(’ and (lis[i-1].isdigit() or lis[-1] == ‘)’),当前字符前半边圆括号,前一字符是数字或者后半个圆括号。这样子,三个条件表达式就成了两个。
        if lis[i].isdigit() and (lis[i-1].isdigit() or lis[i-1] == ')') or lis[i] == '(' and (lis[i-1].isdigit() or lis[-1] == ')'): # 条理稍微清晰,两个嵌套if。
  • 升级蜕变
    两个并列条件的复合条件“二选一”。代码明晰易读,逻辑直白易懂。
    lis[i].isdigit() and lis[i-1] != ‘(’,当前字符是数字,前一字符不是前一半圆括号;lis[i] == ‘(’ and lis[i-1] != ‘(’,当前字符是前半边圆括号,前一字符不是前半边圆括号。因为输入字符串除了数字就是圆括号,这样书写代码简洁而优雅了🤗
        if lis[i].isdigit() and lis[i-1] != '(' or lis[i] == '(' and lis[i-1] != '(': # 两个并列条件的复合条件“二选一”。代码明晰易读,逻辑直白易懂。


  这三种代码书写形式,功用完全一致,但观感却大相径庭。这说明,代码语句,也是需要斟酌推敲的。


  • 代码运行效果截屏图片
    在这里插入图片描述

Python代码


def reTuple(s):
    ''' 字符串还原元组 '''
    lis = s.split()
    result = [lis[0]]
    
    for i in range(1, len(lis)):

        #if lis[i].isdigit() and (lis[i-1].isdigit() or lis[i-1] == ')') or (lis[i] == '(' and lis[i-1].isdigit()) or (lis[i] == '(' and lis[-1] == ')'): # 饶舌复杂,差点把我自己都绕晕。
        #if lis[i].isdigit() and (lis[i-1].isdigit() or lis[i-1] == ')') or lis[i] == '(' and (lis[i-1].isdigit() or lis[-1] == ')'): # 条理稍微清晰,两个嵌套if。
        if lis[i].isdigit() and lis[i-1] != '(' or lis[i] == '(' and lis[i-1] != '(': # 两个并列条件的复合条件“二选一”。代码明晰易读,逻辑直白易懂。
            result += [', '] + [lis[i]]
        else:
            result += [lis[i]]
            
    result = ''.join(result)
    return eval(result), f"{f' 字符串还原成元组 ':=^32}\n\n字符串:“{s}”\n元组:{result}\n\n{'='*40}\n"



回页目录


2.3 下标索引嵌套tuple元素


  将给定下标索引字符串,组装成下标索引tuple之元素。两个reTuple、tupleToStr功能函数都已敲定,剩下的就是按部就班地遍历输入下标索引,从元组取相应的元素输出就行了。


  • 代码运行效果截屏图片
    在这里插入图片描述

Python代码


def main(inStr):
    lines = inStr.split('\n')
    t = reTuple(lines[0])[0]
    result = []
    
    for i in lines[2:]:
        #print(i) # 调试用语句。
        index = ''.join([f"[{j}]" for j in i.split()[1:]])
        #result += [index] # 调试用语句。
        try:
            result += [tupleToStr(eval(f"t{index}"))]
        except:
            result += ['ERROR']

    input(result) # 调试用语句。
    outStr = '\n'.join(map(str, result))
    print(f"\n输入:\n{inStr}\n\n输出:\n{outStr}")



回页目录


3、完整源码(Python)

(源码较长,点此跳过源码)

#!/sur/bin/nve python
# coding: utf-8


def reTuple(s):
    ''' 字符串还原元组 '''
    lis = s.split()
    result = [lis[0]]
    
    for i in range(1, len(lis)):

        #if lis[i].isdigit() and (lis[i-1].isdigit() or lis[i-1] == ')') or (lis[i] == '(' and lis[i-1].isdigit()) or (lis[i] == '(' and lis[-1] == ')'): # 饶舌复杂,差点把我自己都绕晕。
        #if lis[i].isdigit() and (lis[i-1].isdigit() or lis[i-1] == ')') or lis[i] == '(' and (lis[i-1].isdigit() or lis[-1] == ')'): # 条理稍微清晰,两个嵌套if。
        if lis[i].isdigit() and lis[i-1] != '(' or lis[i] == '(' and lis[i-1] != '(': # 两个并列条件的复合条件“二选一”。代码明晰易读,逻辑直白易懂。
            result += [', '] + [lis[i]]
        else:
            result += [lis[i]]
            
    result = ''.join(result)
    return eval(result), f"{f' 字符串还原成元组 ':=^32}\n\n字符串:“{s}”\n元组:{result}\n\n{'='*40}\n"


tupleToStr = lambda x: x if type(x) != tuple else f"( {' '.join(map(str, x))} )" # 如果是tuple,则搞成题目样例输入那样的“元组”。
#input(tupleToStr((5, 6, 7))) # 函数试炼语句。


def main(inStr):
    lines = inStr.split('\n')
    t = reTuple(lines[0])[0]
    result = []
    
    for i in lines[2:]:
        #print(i) # 调试用语句。
        index = ''.join([f"[{j}]" for j in i.split()[1:]])
        #result += [index] # 调试用语句。
        try:
            result += [tupleToStr(eval(f"t{index}"))]
        except:
            result += ['ERROR']

    input(result) # 调试用语句。
    outStr = '\n'.join(map(str, result))
    print(f"\n输入:\n{inStr}\n\n输出:\n{outStr}")




if __name__ == '__main__':
    inStr = '''( 1 2 ( 3 4 ( 5 6 7 ) 8 ) 9 10 )
6
1 1
2 2 1
3 2 2 2
2 2 2
2 1 0
3 2 2 3'''
    main(inStr) # 调用main函数完成作业。
    s = '( 1 2 ( 3 4 ( 5 6 ) ) 7 ( 8 9 ) ( )  10 )'
    s2 = '( 1 2 ( 3 4 ( 5 6 7 ) 8 ) 9 10 )'
    print(f"\n\n样例一:\n{reTuple(s)[1]}\n\n样例二:\n{reTuple(s2)[1]}")



回页首


上一篇:  最大通关数(洛洛和晶晶计划一起挑战峡谷深渊,峡谷左右有不同数量的关卡,每个关卡需要不同的紫水晶通关,用给定的紫水晶依次通过最多的关卡)
下一篇: 



我的HOT博:

  本次共计收集289篇博文笔记信息,总阅读量44.72w。数据采集于2023年12月11日 23:07:13,用时5分11.8秒。阅读量不小于4.0k的有17篇。

  1. ChatGPT国内镜像站初体验:聊天、Python代码生成等
    地址:https://blog.csdn.net/m0_57158496/article/details/129035387
    浏览阅读:6.2w
    点赞:127 收藏:809 评论:71
    (本篇笔记于2023-02-14 23:46:33首次发布,最后修改于2023-07-03 05:50:55)

  2. 让QQ群昵称色变的神奇代码
    地址:https://blog.csdn.net/m0_57158496/article/details/122566500
    浏览阅读:5.8w
    点赞:24 收藏:86 评论:17
    (本篇笔记于2022-01-18 19:15:08首次发布,最后修改于2022-01-20 07:56:47)

  3. Python列表(list)反序(降序)的7种实现方式
    地址:https://blog.csdn.net/m0_57158496/article/details/128271700
    浏览阅读:9.9k
    点赞:5 收藏:30 评论:8
    (本篇笔记于2022-12-11 23:54:15首次发布,最后修改于2023-03-20 18:13:55)

  4. pandas 数据类型之 DataFrame
    地址:https://blog.csdn.net/m0_57158496/article/details/124525814
    浏览阅读:9.4k
    点赞:7 收藏:34 
    摘要:pandas 数据类型之 DataFrame_panda dataframe。
    (本篇笔记于2022-05-01 13:20:17首次发布,最后修改于2022-05-08 08:46:13)

  5. 个人信息提取(字符串)
    地址:https://blog.csdn.net/m0_57158496/article/details/124244618
    浏览阅读:7.7k
    摘要:个人信息提取(字符串)_python个人信息提取。
    (本篇笔记于2022-04-18 11:07:12首次发布,最后修改于2022-04-20 13:17:54)

  6. Python字符串居中显示
    地址:https://blog.csdn.net/m0_57158496/article/details/122163023
    浏览阅读:7.2k
    评论:1
  7. 罗马数字转换器|罗马数字生成器
    地址:https://blog.csdn.net/m0_57158496/article/details/122592047
    浏览阅读:7.2k
    (本篇笔记于2022-01-19 23:26:42首次发布,最后修改于2022-01-21 18:37:46)

  8. 斐波那契数列的递归实现和for实现
    地址:https://blog.csdn.net/m0_57158496/article/details/122355295
    浏览阅读:5.6k
    点赞:4 收藏:2 评论:8
  9. 回车符、换行符和回车换行符
    地址:https://blog.csdn.net/m0_57158496/article/details/123109488
    浏览阅读:5.5k
    点赞:2 收藏:3 
    摘要:回车符、换行符和回车换行符_命令行回车符。
    (本篇笔记于2022-02-24 13:10:02首次发布,最后修改于2022-02-25 20:07:40)

  10. python清屏
    地址:https://blog.csdn.net/m0_57158496/article/details/120762101
    浏览阅读:5.3k
  11. 练习:字符串统计(坑:f‘string‘报错)
    地址:https://blog.csdn.net/m0_57158496/article/details/121723096
    浏览阅读:5.1k
  12. 练习:尼姆游戏(聪明版/傻瓜式•人机对战)
    地址:https://blog.csdn.net/m0_57158496/article/details/121645399
    浏览阅读:5.1k
    点赞:14 收藏:44 
  13. 我的 Python.color() (Python 色彩打印控制)
    地址:https://blog.csdn.net/m0_57158496/article/details/123194259
    浏览阅读:4.6k
    点赞:2 收藏:8 
    摘要:我的 Python.color() (Python 色彩打印控制)_python color。
    (本篇笔记于2022-02-28 22:46:21首次发布,最后修改于2022-03-03 10:30:03)

  14. 练习:生成100个随机正整数
    地址:https://blog.csdn.net/m0_57158496/article/details/122558220
    浏览阅读:4.6k
    (本篇笔记于2022-01-18 13:31:36首次发布,最后修改于2022-01-20 07:58:12)

  15. 密码强度检测器
    地址:https://blog.csdn.net/m0_57158496/article/details/121739694
    浏览阅读:4.4k
    (本篇笔记于2021-12-06 09:08:25首次发布,最后修改于2022-11-27 09:39:39)

  16. 罗马数字转换器(用罗马数字构造元素的值取模实现)
    地址:https://blog.csdn.net/m0_57158496/article/details/122608526
    浏览阅读:4.2k
    (本篇笔记于2022-01-20 19:38:12首次发布,最后修改于2022-01-21 18:32:02)

  17. 练习:班里有人和我同生日难吗?(概率probability、蒙特卡洛随机模拟法)
    地址:https://blog.csdn.net/m0_57158496/article/details/124424935
    浏览阅读:4.0k
    摘要:班里有人和我同生日难吗?(概率probability、蒙特卡洛随机模拟法)_生日模拟问题,计算频率,并画出随着试验次数n的增大,频率和理论概率的 关系图。
    (本篇笔记于2022-04-26 12:46:25首次发布,最后修改于2022-04-27 21:22:07)

推荐条件 阅读量突破4.0k
(更多热博,请点击蓝色文字跳转翻阅)



回页首


老齐漫画头像

精品文章:

  • 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
  • OPP三大特性:封装中的property
  • 通过内置对象理解python'
  • 正则表达式
  • python中“*”的作用
  • Python 完全自学手册
  • 海象运算符
  • Python中的 `!=`与`is not`不同
  • 学习编程的正确方法

来源:老齐教室


◆ Python 入门指南【Python 3.6.3】


好文力荐:

  • 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
  • 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
  • 靠谱程序员的好习惯
  • 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归

CSDN实用技巧博文:

  • 8个好用到爆的Python实用技巧
  • python忽略警告
  • Python代码编写规范
  • Python的docstring规范(说明文档的规范写法)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/278754.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云标准型S5服务器4核8G配置优惠价格表

腾讯云4核8G服务器S5和轻量应用服务器优惠价格表,轻量应用服务器和CVM云服务器均有活动,云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元,5年6490.44元,轻量应用服务器4核8G12M带宽一年446元、529元15个月,腾讯云…

docker入门概念详解

本篇文章对docker的一些基础概念和周边概念进行了详细解释。帮助你可以很好的理解docker是用来干什么的,docker是怎么工作的。其中有docker所运用到的技术解释,docker的不同发展版本,dokcer的架构,docker的生态等等详解。希望本片…

Django 文件上传(十二)

当 Django 处理文件上传时,文件数据最终会被放置在 request.FILES 。 查看文档:文件上传 | Django 文档 | Django Django工程如下: 创建本地存储目录 在static/应用目录下创建uploads目录用于存储接收上传的文件 在settings.py 配置静态目…

Shell脚本-bin/bash: 解释器错误: 没有那个文件或目录-完整路径执行-“/”引发的脑裂

引起该不适的一种可能以及解决方案,网上较多,比如: 但按以上方式操作,并经过查看,发现仍然未能解决问题。 因为两种方式执行,有一种能成功,有一种不能,刚开始未怀疑是文件问题&…

写实风格3D模型材质贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 写实3D模型的制作过程包括建模、材质贴图、灯光设置和渲染等步骤。首…

ViT的极简pytorch实现及其即插即用

先放一张ViT的网络图 可以看到是把图像分割成小块,像NLP的句子那样按顺序进入transformer,经过MLP后,输出类别。每个小块是16x16,进入Linear Projection of Flattened Patches, 在每个的开头加上cls token和位置信息,…

【软件测试】为bug而生

为什么定位问题如此重要? 可以明确一个问题是不是真的“bug” 很多时候,我们找到了问题的原因,结果发现这根本不是bug。原因明确,误报就会降低多个系统交互,可以明确指出是哪个系统的缺陷,防止“踢皮球”&…

【23.12.29期--Redis缓存篇】谈一谈Redis的集群模式

谈一谈Redis的集群模式 ✔️ 谈一谈Redis的集群模式✔️主从模式✔️ 特点✔️Redis主从模式Demo ✔️哨兵模式✔️Redis哨兵模式Demo✔️特点 ✔️Cluster模式✔️Redis Cluster模式Demo✔️特点 ✔️ 谈一谈Redis的集群模式 Redis有三种主要的集群模式,用于在分布…

电气产品外壳常用材质PA、PC、PBT、ABS究竟是什么?

在如今工业制造领域,各种改性塑料、复合材料以及轻质合金材料的运用日趋成熟。在电气领域,不同电气产品的外壳、组件材质采用不同材料,以同为科技(TOWE)电气产品为例,工业连接器系列产品采用PA6外壳材质、机…

【SD】一致性角色 - 表情差异生成 【1】

原理:通过segment 局部重绘 可以根据lora 产生面部表情图片 模型:sam_vit_h_4b8939.pth 导入图片到segment 开启:Enable GroundingDINO GroundingDINO Detection Prompt :输入 face 然后点击:Preview Segmentation …

如何文件从电脑传到iPhone,这里提供几个方法

本文介绍了如何使用Finder应用程序、iTunes for Windows、iCloud和谷歌照片将照片从Mac或PC传输到iPhone。 如何将照片从Mac传输到iPhone 如果你有一台Mac电脑,里面装满了你想转移到iPhone的照片,这是一件非常简单的事情。只需遵循以下步骤&#xff1a…

LIUNX进程程序替换

1.什么是程序替换 a.一个程序,只能执行自己的代码 b.如果想要一个程序执行,别的程序的代码呢? 我们就可以创建一个子进程,将这个子进程替换为我们想要执行的程序。 2.样例代码-----execl(接口) 返回值&…

跨进程通信 macOS XPC 创建实例

一:简介 XPC 是 macOS 里苹果官方比较推荐和安全的的进程间通信机制。 集成流程简单,但是比较绕。 主要需要集成 XPC Server 这个模块,这个模块最终会被 apple 的根进程 launchd 管理和以独立进程的方法唤起和关闭, 我们主app 进…

交叉编译aarch64架构支持openssl的curl、libcurl

本文档旨在指导读者在x86_64平台上交叉编译curl和openssl库以支持aarch64架构。在开始之前,请确保您的系统环境已正确配置。 1. 系统环境准备 系统是基于Ubuntu 20.04 LTS,高版本可能会有问题。首页,安装必要的开发工具和库文件。打开终端并…

QML 怎么调用 C++ 中的内容?

以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/z_JlmNe6cYldNf11Oad_JQ 先说明一下测试环境 编译器:vs2017x64 开发环境:Qt5.12 这里主要是总结一下,怎么在…

Java——猫猫图鉴微信小程序(前后端分离版)

目录 一、开源项目 二、项目来源 三、使用框架 四、小程序功能 1、用户功能 2、管理员功能 五、使用docker快速部署 六、更新信息 审核说明 一、开源项目 猫咪信息点-ruoyi-cat: 1、一直想做点项目进行学习与练手,所以做了一个对自己来说可以完成的…

MFC随对话框大小改变同时改变控件大小

先看一下效果; 初始; 窗口变大,控件也变大; 二个也可以; 窗口变大,控件变大; 默认生成的对话框没有WM_SIZE消息的处理程序;打开类向导,选中WM_SIZE消息,对CxxxDlg类添加该消息的处理程序;默认生成的函数名是OnSize; 添加了以后代码中会有三处变化; 在对话框类的…

嵌入式SOC之通用图像处理之OSD文字信息叠加的相关实践记录

机缘巧合 机缘巧合下, 在爱芯元智的xx开发板下进行sdk的开发.由于开发板目前我拿到是当前最新的一版(估计是样品),暂不公开开发板具体型号信息.以下简称板子 .很多优秀的芯片厂商,都会提供与开发板配套的完善的软件以及完善的技术支持(FAE),突然觉得爱芯…

鸿蒙(HarmonyOS 3.1) DevEco Studio 3.1开发环境汉化

鸿蒙(HarmonyOS 3.1) DevEco Studio 3.1开发环境汉化 一、安装环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、设置过程 打开IDE,在第一个菜单File 中找到Settings...菜单 在Setting...中找到Plugins…

VSCode远程开发配置

目录 概要远程开发插件安装开始连接SSH无密码登录开发环境配置 概要 现在很多公司都是直接远程到服务器上写代码,使用远程开发,可以在与生产环境相同的环境中开发、测试和部署代码,减少因环境不同而导致的问题。当下VSCode远程开发是支持的比…