我正在写一些关于列表理解的代码,程序需要做的是从标准输入中打印至少5个字符长(我已经完成)的回文。例如,“达蒙”,“游牧”,“狂欢”,“杠杆”都应与回文词一起放入一个列表中。
我已经尝试过stackoverflow和其他编程网站来寻求帮助,该任务已正确完成,但不是列表理解形式。
import sys
line = sys.stdin
all_text = [a.strip() for a in line]
atleast_5_letters = [a for a in all_text if len(a) >= 5]
reverse_words = [a for a in atleast_5_letters]
palindrome = [a for a in atleast_5_letters if a[::-1].upper() == a.upper()]
print(palindrome)
#stdin input:
#Ababa
#aaaaa
#bob
#civic
#ccccc
#Damon
#england
#Hannah
#lager
#leper
#level
#lever
#madam
#minim
#nomad
#radar
#racecar
#RaCeCar
#refer
#regal
#repel
#revel
#rever
#rotor
#tenet
#queen
['Ababa','civic','Damon','Hannah','lager','leper','level','lever','madam','minim','nomad','radar ','refer','regal','repel','revel','rever','rotor','tenet']
答案 0 :(得分:3)
首先,我将得到一个由五个字母组成的小写字母集(这使下一步更加容易):
atleast_5_letters_lower = set([w.lower() for w in atleast_5_letters])
然后,从列表中找到单词,其中该单词在集合中也显示为逆转,忽略大写字母,但保留原始大写字母:
reverse_words = [a for a in atleast_5_letters if a[::-1].lower() in atleast_5_letters_lower]
输入文字的结果:
['Ababa', 'aaaaa', 'bob', 'civic', 'ccccc', 'Damon', 'Hannah', 'lager', 'leper', 'level', 'lever', 'madam', 'minim', 'nomad', 'radar', 'racecar', 'RaCeCar', 'refer', 'regal', 'repel', 'revel', 'rever', 'rotor', 'tenet']
答案 1 :(得分:1)
希望这是您要找的
palindrome=[a for a in all_text if (len(a) >= 5 and a[::-1].upper()==a.upper())]
长度大于5的保存回文。
答案 2 :(得分:0)
另一种使用单列表理解的方法:
import sys
line = sys.stdin
print ([a.strip() for a in line if len(a.strip()) >= 5 if a.strip()[::-1].upper() == a.strip().upper()])
注意:这将只打印大于5个字母的回文词,而不打印非回文词的反转词。
示例输入:
Ababa
aaaaa
bob
civic
Damon
示例输出:
['Ababa', 'aaaaa', 'civic']
答案 3 :(得分:0)
出于可读性考虑,reversed()
非常适合回文检查。
line = """#Ababa
#aaaaa
#bob
#civic
#ccccc
#Damon
"""
#line = line.splitlines()
all_text = [a.strip('#') for a in line.splitlines() if len(a) >= 5]
palindrome = [a for a in all_text if ("".join(reversed(a.lower())) == a.lower())]
print(palindrome, end=' ')
#Output:
['Ababa', 'aaaaa', 'civic', 'ccccc']