字符串转换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-8def 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规范(说明文档的规范写法)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mfc100u.dll文件丢失了要怎么解决?修复mfc100u.dll详细指南

mfc100u.dll文件丢失了要怎么解决?首先让我们扒一扒什么是 mfc100u.dll。这玩意儿是 Microsoft Visual Studio 2010 的一部分,它就像一款程序生活中不可或缺的零件,没了它,程序肯定跑不起来。想想看,没有一个重要的零件&#xff…

【Azure 架构师学习笔记】- Azure Databricks (4) - 使用Azure Key Vault 管理ADB Secret

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (3) - 再次认识DataBricks 前言 Azure Databricks有access token,是具有ADB内部最高权限的token。在云环境中这些高级别权限的sec…

【Python基础011】Python中字符串的具体用法

1、创建 字符串的创建共有3种方式 1)单/双引号创建短字符串 s hello worlds “hello world” 2)三个单/双引号创建短字符串 三个单/双引号一般用于多行文本的注释,如果将这样的字符串用print打印,或者赋给一个变量,…

leetcode贪心算法题总结(二)

本节目录 1.最长回文串2.增减字符串匹配3.分发饼干4.最优除法5.跳跃游戏II6.跳跃游戏7.加油站8.单调递增的数字9.坏了的计算器 1.最长回文串 最长回文串 class Solution { public:int longestPalindrome(string s) {//计数一:用数组模拟哈希表int hash[127] {0}…

自定义拖拽表单的优势表现在哪里?

利用自定义拖拽表单,可以让办公更轻松,效率更高,是理想的提质增效办公工具。哪里有自定义拖拽表单?它又有什么样的优势特点?流辰信息是专业研发低代码技术平台的服务商,经验足、研发实力强、服务好&#xf…

2024年第三届服务机器人国际会议(ICoSR 2024) | Ei、Scopus双检索

会议简介 Brief Introduction 2024年第三届服务机器人国际会议(ICoSR 2024) 会议时间:2024年7月26日-28日 召开地点:中国杭州 大会官网:www.iwosr.org 进入新时代,科技更新迭代快速发展,机器人不仅变得更加节能&#x…

Python3 XML解析

Python3 XML解析 什么是XML? XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 XML 被设计用来传输和存储数据。 XML是一套定义语义…

HarmonyOS page生命周期函数讲解

下面 我们又要看一个比较重要的点了 页面生命周期 页面组件有三个生命周期 onPageShow 页面显示时触发 onPageHide 页面隐藏时触发 onBackPress 页面返回时触发 这里 我们准备两个组件 首先是 index.ets 参考代码如下 import router from ohos.router Entry Component struc…

gFTP - 多线程 FTP 客户端工具

gFTP - 多线程 FTP 客户端工具 1. Download gFTP2. GUIReferences https://github.com/masneyb/gftp gFTP is a free and open-source multithreaded File Transfer Protocol client program. It is most used on Unix-like systems such as Linux, macOS, and Sony PlayStati…

FPGA设计时序约束十四、Set_External_Delay

一、序言 在时序约束中对clock的约束还存在一种特殊的延时约束set external delay。set external delay如字面含义,设置外部的时延值,但这个外部时延主要是指反馈时延,即信号从FPGA的output端口输出后经过外部电路回到输入端口的时延值。 二…

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

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

AI大模型时代下运维开发探索第二篇:基于大模型(LLM)的数据仓库

在SREWorks社区聚集了很多进行运维数仓建设的同学,大家都会遇到类似的挑战和问题: 数仓中存储大量数据消耗成本,但很多存储的数据却并没有消费。进数仓的ETL学习成本高、管理成本高,相关同学配合度低,以及上游结构改动…