这个问题困扰着我的大脑
有26个下划线按顺序显示英文字母。 表示字母a,b和g应分别用字母k,j和r代替,而所有其他字母均不代替。
我该怎么做? python如何检测每个下划线=每个英文字母?
我以为我可以使用str.replace to do this
,但这比我想象的要困难。
感谢
答案 0 :(得分:2)
您可以使用str.translate
:
In [8]: from string import ascii_lowercase
In [9]: text.translate({ord(l): l if g == '_' else g for g, l in zip(guess, ascii_lowercase)})
Out[9]: 'i km jen .'
这会将string.ascii_lowercase
的元素映射到guess
的元素(按位置)。如果guess
的元素是下划线,则会使用来自ascii_lowercase
的相应字母。
答案 1 :(得分:0)
如果您有一个字母表列表,然后是下划线列表,请输入一个for循环,然后只比较这两个值,如果它存在或不存在,则附加到列表
答案 2 :(得分:0)
>>> text = "i am ben ."
>>> guess = "kj____r___________________"
>>> d = dict()
>>> for i in xrange(len(guess)):
... if(guess[i] != "_"):
... d[chr(i+97)] = guess[i]
...
>>> d
{'a': 'k', 'b': 'j', 'g': 'r'}
>>> text_list = list(text)
>>> text_list
['i', ' ', 'a', 'm', ' ', 'b', 'e', 'n', ' ', '.']
>>> for i in xrange(len(text_list)):
... if(text_list[i] in d):
... text_list[i] = d.get(text_list[i])
...
>>> text_list
['i', ' ', 'k', 'm', ' ', 'j', 'e', 'n', ' ', '.']
>>> text_final = "".join(text_list)
>>> text_final
'i km jen .'
>>>
答案 3 :(得分:0)
拉链他们:
import string
zipped = zip(string.ascii_lowercase, "kj____r___________________")
print(zipped)
# [('a', 'k'), ('b', 'j'), ('c', '_'), ('d', '_'), ('e', '_'), ('f', '_'), ('g', 'r'), ('h', '_'), ('i', '_'), ('j', '_'), ('k', '_'), ('l', '_'), ('m', '_'), ('n', '_'), ('o', '_'), ('p', '_'), ('q', '_'), ('r', '_'), ('s', '_'), ('t', '_'), ('u', '_'), ('v', '_'), ('w', '_'), ('x', '_'), ('y', '_'), ('z', '_')]
将其转换为字典:
dict_ = dict(zipped)
print(dict_)
# {'a': 'k', 'b': 'j', 'c': '_', 'd': '_', 'e': '_', 'f': '_', 'g': 'r', 'h': '_', 'i': '_', 'j': '_', 'k': '_', 'l': '_', 'm': '_', 'n': '_', 'o': '_', 'p': '_', 'q': '_', 'r': '_', 's': '_', 't': '_', 'u': '_', 'v': '_', 'w': '_', 'x': '_', 'y': '_', 'z': '_'}
然后使用for循环进行替换:
inp = "I am Ben."
result = ""
for letter in inp:
if letter in dict_:
if dict_[letter] != "_"
result += dict_[letter]
continue
result += letter
总而言之:
def sub(text, criteria):
import string
dict_ = dict(zip(string.ascii_lowercase, criteria))
result = ""
for letter in text:
if letter in dict_:
if dict_[letter] != "_":
result += dict_[letter]
continue
result += letter
return result
>>> sub("I am Ben. abg abg", "kj____r___________________")
'I km Ben. kjr kjr'
答案 4 :(得分:0)
让我们一步一步解决您的问题,而不要让它过于复杂:
第一步:
因此,第一步是用户提供或您已经拥有的数据收集:
假设您有一个a-z字母表列表,而其他列表已替换为“_”下划线和字母:
如果您没有让我们收集数据:
a-z字母表:
alphabet_list=list(map(chr,range(97,123)))
它会给出:
>>> print(alphabet_list)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
接下来,如果您没有下划线列表:
underscore_list=[]
for i in range(1,27):
b.append("_")
让我们稍微修改一下这个列表吧,让它像你的一样:
modified_underscore_list=['k', 'j', '_', '_', '_', '_', 'g', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_']
第二步:
现在你已经掌握了所有需要解决问题的东西让我们现在就开始第二步:
我们必须将第一个列表的每个元素映射到其他列表,以便我们可以将此结果保存为字典格式:
(记住一件事dict键不能相同或重复,但值可以是)
让我们迭代列表一并列出两个,然后将输出保存为字典格式:
为此,我们需要在两个列表上进行迭代,因此我们将使用内置的zip函数:
final_output={} #we will save our iteration output in this dict
for i,j in zip(alphabet_list,modified_underscore_list):
final_output[i]=j
我们现在可以看到这个词:
{'p': '_', 'k': '_', 'w': '_', 't': '_', 'i': '_', 'c': '_', 'b': 'j', 'j': '_', 'a': 'k', 's': '_', 'g': 'g', 'x': '_', 'm': '_', 'l': '_', 'h': '_', 'o': '_', 'd': '_', 'n': '_', 'y': '_', 'r': '_', 'e': '_', 'u': '_', 'f': '_', 'v': '_', 'q': '_', 'z': '_'}
现在我们已经映射了数据:
转到第三步也是最后一步:
第三步:
现在请求用户输入并检查我们的最终字典中是否有用户字符串的字符,如果是,则只用字典中的那些键的值替换“a”“g”和“b”,简单:
ask_input=str(input("enter string"))
ask=list(ask_input)
for i,j in enumerate(ask):
if j in final_output:
if j=="a" or j=="b" or j=="g":
ask[i]=final_output.get(j)
print("".join(ask))
所以我们的完整代码是:
alphabet_list=list(map(chr,range(97,123)))
modified_underscore_list=['k', 'j', '_', '_', '_', '_', 'g', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_']
final_output={}
for i,j in zip(alphabet_list,modified_underscore_list):
final_output[i]=j
ask_input=str(input("enter string"))
ask=list(ask_input)
for i,j in enumerate(ask):
if j in final_output:
if j=="a" or j=="b" or j=="g":
ask[i]=final_output.get(j)
print("".join(ask))