list comprehension使用字典和if else语句

Jom*_*ugi 0 python dictionary list

我是一个列出理解能力的初学者,我很难搞清楚什么.根据我在stackoverflow和其他网站上看到的例子,我有一个列表理解似乎它应该工作,但我还没有能够完成所需的输出,因为我一直无法找出正确的语法我想完成.

给定一个字符串,我希望我的函数返回字符串,其中字母字符替换为与提供的字典中的键相关联的值.对于那个任务我的列表理解有效,但我还需要任何字符和空格保持完整(没有变化).

这是我尝试过的:

#random dictionary for my example 
d = {'a': 'b', 'c': 'i', 'b': 'a', 'e': 'j', 'd': 'm', 'g': 'q','f': 'l',  
     'i': 'c', 'h': 'w', 'k': 'r', 'j': 'e', 'm': 'd','l': 'f', 'o': 'v', 
     'n': 's', 'q': 'g', 'p': 't', 's': 'n','r': 'k', 'u': 'x', 't': 'p', 
     'w': 'h', 'v': 'o', 'y': 'z', 'x': 'u', 'z': 'y'}
def cipher(message):
    word = list(message)
    word = [v for x in word for k,v in d.iteritems() if x == k]
    #word = [v for x in word for k,v in d.iteritems() if x == k else x for x in word]
    return "".join(word)

print cipher("that tree is far away!")
Run Code Online (Sandbox Code Playgroud)

这将返回我的字符串,正确更改了字母字符,但没有空格,没有!标记.从进一步的研究,这导致我尝试在我的代码示例中注释掉的列表理解中的else语句,但这不起作用.

我可以编辑我的语法,还是可以使用列表理解来完成我想要做的事情?

进一步澄清:

我收到这个输出: pwbppkjjcnlbkbhbz

我想要这个输出: pwbp pkjj cn lbk bhbz!

Mos*_*oye 6

您当前的方法会过滤掉字典中没有的所有字符.空白和感叹.

您可以使用.get字典的方法来获取替换,并在映射中不存在替换字符时返回原始字符:

def decipher(message):
    return "".join(d.get(x, x) for x in message)

print decipher("that tree is far away!")
#pwbp pkjj cn lbk bhbz!
Run Code Online (Sandbox Code Playgroud)

请注意,字符串是可迭代的,因此word = list(message)实际上不是必需的,可以删除.


另一方面,函数的名称可能更好 cipher