鱼C论坛

 找回密码
 立即注册
查看: 2742|回复: 2

[技术交流] python回文联多种解决方案

[复制链接]
发表于 2017-4-20 09:36:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 李金龙 于 2017-4-20 14:22 编辑

大部分代码来源于小甲鱼社区,如需要提问,请搜索小甲鱼社区,或在下文中访问相关链接。
所谓回文联:
  • 天连碧水碧连天
  • 洞帘水挂水帘洞
  • 山果花开花果山
  • 脸映桃红桃映脸
  • 海上飞燕飞上海
  • 江内行船行内江
  • 河边赛车赛边河

列表倒叙判断

代码分析,从上面的一些回文联中发现了一些现象,第一个字与最后一个字相同,第二个字与最后第二个字相同,这种思路下答案会是:
  1. def judge():
  2.     n = input('please enter a string :')
  3.     if n == n[::-1]:
  4.         for i in n[::-1]:
  5.             print(i)
  6.         print('yes')
  7.     else:
  8.         print('no')
  9. judge()
复制代码
原文链接:。。。找不到了
   其实一开始有一个问题,把我难住了,就是n == n[::-1]在我的理解里面它只会判断第一个与最后一个,但是后面使用for循环将其一个一个打印出来后,才发现它判断了每一个字符,在此感谢群里(528770819)茶晓的点拨。
使用list和翻转的功能进行对比:
  1. def fun(hwl):
  2.     list1=list(hwl)
  3.     list2=reversed(list1)
  4.     print(list1,list(list2))
  5.     if list1==list(list2):
  6.         return 'yes'
  7.     else:
  8.         return 'no'
  9. print (fun(input('请输入您要判读的回文联:')))
复制代码
请注意这是错误的,原文链接:http://bbs.fishc.com/thread-84863-1-1.html
Python3 官方文档这样介绍 reverse()方法语法:list.reverse() 该方法没有返回值,但是会对列表的元素进行反向排序。
但是还没完,这个标签还是可以用,只是用的方法超过了19课的课程,就当作提前预习了。
  1. def fun1(str1):
  2.     str2 = ''.join(reversed(str1))
  3.     print(str1,list(str1))
  4.     print(str2,list(str2))
  5.     if str2 == str1:
  6.         return 'yes'
  7.     else:
  8.         return 'no'
  9. print(fun1(input('输入要判断的回文联:')))
复制代码
join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串,''.join(reversed(str1))  ,用空区分,就是啥玩意也没有,反转str1的内容,进行内容的判断。

缩写(三元操作符):
  1. def fun1(str1):
  2.     return 'yes' if str1 == ''.join(reversed(str1)) else 'no'
复制代码

通过数字的叠加来判断回文链接
  1. def huiwenlian(string):
  2.     length=len(string)
  3.     count=length//2
  4.     flag=0
  5.     for i in range(count):
  6.         if string[i]==string[length-1-i]:
  7.             flag += 1
  8.             print(string[i],string[length-1-i],flag)   #后加的一行,因为一直没看懂
  9.     if  flag== count:
  10.         print('是回文联')
  11.     else:
  12.         print('不是回文联')
  13. stringset=input('请输入:')
  14. huiwenlian(stringset)
复制代码
原文链接:http://bbs.fishc.com/thread-67989-1-1.html
其实一开始没看懂,计算长度,怎么去对比,后来去打印string==string[length-1-i],才明白过来,这里还有个绕脑筋的,就是python是从零开始记位,而后面是从-1开始的,所以就是后面多了一个-1这个运算。
  1. 请输入:天连碧水水碧连天
  2. 8 4
  3. 天 天 1
  4. 连 连 2
  5. 碧 碧 3
  6. 水 水 4
  7. 是回文联
复制代码

通过递归判断
  1. def is_palindrome(n, start, end):
  2.         if start > end:
  3.             return 1
  4.         else:
  5.             return is_palindrome(n, start+1, end-1) if n[start] == n[end] else 0
  6. string = input('请输入一串字符串:')
  7. length = len(string)-1
  8. if is_palindrome(string, 0, length):
  9.         print('"%s"是回文字符串!' % string)
  10. else:
  11.         print('"%s"不是回文字符串!' % string)
复制代码
逻辑与上面的相差不多,注意辨别string,与start,被这个给混淆了。


本文由李金龙收集整理转载请注明:https://www.lijinlong.cc/python/pyxt/1815.html

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-20 09:41:42 | 显示全部楼层
金龙出品必属精品
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-20 09:43:48 | 显示全部楼层

重新排版了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 19:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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