python-3.x 如何为颠倒的单词做一个列表理解?

hlswsv35  于 2023-07-01  发布在  Python
关注(0)|答案(5)|浏览(131)

我正在写一些关于列表解析的代码,程序需要做的是从标准输入中打印任何至少5个字符长的回文(我已经这样做了),并反转。例如,“Damon”“nomad”“revel”“lever”都应该和回文词一起放在一个列表中。
我试过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',' ref','regal',' repel','revel',' rever','rotor','tenet']

axr492tv

axr492tv1#

首先,我会得到一组小写的五个字母的单词(这使得下一步更容易):

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']
nukf8bse

nukf8bse2#

希望这就是你要找的

palindrome=[a for a in all_text if (len(a) >= 5 and a[::-1].upper()==a.upper())]

保存长度大于5的回文。

cwdobuhd

cwdobuhd3#

另一个使用单列表解析的方法:

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']
ux6nzvsh

ux6nzvsh4#

出于可读性的考虑,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']
rnmwe5a2

rnmwe5a25#

这可能是有用的,类似于上面的答案,但返回一个列表。

list_of_lists = [[1, 2, 3, 4], ['a', 'b', 'c', 'd'], [1.0, 2.0, 3.0, 4.0]]
reversed_list = [("|||".join(reversed(list_item))).split('|||') for item in list_of_lists]

相关问题