我希望用列表理解来简化替换字符串 in-situ 的特定字符。到目前为止,尝试只返回一个字符串列表 - 每个列表项,每个字符都替换为检查字符串。
建议/解决方案?
输入:
reveal = "password"
ltrTried = "sr"
必填项:
return = "**ss**r*"
获得:
('**ss****', '******r*')
答案 0 :(得分:2)
如果你想使用列表理解来做这件事,你想要逐个字母地替换它:
reveal = "".join((letter if letter in ltrFound else "*") for letter in reveal)
请注意
reveal
字符串,而不是您的ltrFound
列表(或字符串)。letter if letter in ltrFound else "*"
替换每个项目。这可确保如果reveal
中的字母不在ltrFound
中,则会替换为*。答案 1 :(得分:2)
只是为了好玩,通过使用翻译地图,这是一种不同的方式来实现这一目标。
如果您想要替换ltrFound
中的所有内容,那将很容易:
tr = str.maketrans(ltrFound, '*' * len(ltrFound))
print(reveal.translate(tr))
但是你想做相反的事情,在ltrFound
中替换不的所有内容。并且您不希望构建所有不是s
的100K +字符的转换表。那么,你能做什么?
您可以构建一个包含s
但不在reveal
中的6个字符的表格:
notFound = ''.join(set(reveal) - set(ltrFound)) # 'adoprw'
tr = str.maketrans(notFound, '*' * len(notFound))
print(reveal.translate(tr))
以上是使用Python 3.x;对于2.x,maketrans
是string
模块中的函数,而不是str
类的类方法(还有一些其他差异,但它们在这里无关紧要) 。所以:
import string
notFound = ''.join(set(reveal) - set(ltrFound)) # 'adoprw'
tr = string.maketrans(notFound, '*' * len(notFound))
print(reveal.translate(tr))
答案 2 :(得分:1)
试试这个
re.sub("[^%s]"%guesses,"*",solution_string)
假设猜测是一个字符串