列表理解使用字典和if else语句

时间:2017-01-31 21:09:01

标签: python list dictionary

我是一个列出理解力的初学者,我很难搞清楚。根据我在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!")

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

我可以编辑我的语法,还是无法使用列表推导完成我想要做的事情?

进一步澄清:

我收到此输出:pwbppkjjcnlbkbhbz

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

1 个答案:

答案 0 :(得分:6)

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

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

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!

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

另一方面,该函数的名称可能更好地读作cipher