使用列表理解替换符号

时间:2014-09-09 23:02:25

标签: python list list-comprehension

我希望用列表理解来简化替换字符串 in-situ 的特定字符。到目前为止,尝试只返回一个字符串列表 - 每个列表项,每个字符都替换为检查字符串。

建议/解决方案?

输入:

reveal = "password"
ltrTried = "sr"

必填项:

return = "**ss**r*"

获得:

('**ss****', '******r*')

3 个答案:

答案 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,maketransstring模块中的函数,而不是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)

假设猜测是一个字符串