如何使用python将此函数/ for循环转换为列表解析器或更高阶函数?

时间:2014-09-03 15:17:05

标签: python list-comprehension higher-order-functions

大家好,我使用函数和for循环编写了以下简单的翻译程序,但我试图更好地理解列表理解/高阶函数。我对map和listcomprehensions等函数有一个非常基本的把握,但是当循环需要占位符值(例如下面代码中的place_holder)时,我不知道如何使用它们。此外,任何有关我能做得更好的建议都将不胜感激。在此先感谢,你们摇滚!

P.S你如何得到那些花哨的格式,我发布的代码在记事本++中看起来像什么?

    sweedish = {'merry': 'god', 'christmas': 'jul', 'and': 'och', 'happy':'nytt','year':'ar'}
    english =('merry christmas and happy new year')
    def translate(s):
        new = s.split() #split the string into a list 
        place_holder = [] #empty list to hold the translated word
        for item in new: #loop through each item in new 
            if item in sweedish: 
                place_holder.append(sweedish[item]) #if the item is found in sweedish, add the corresponding value to place_holder
        for item in place_holder: #only way I know how to print a list out with no brackets, ' or other such items. Do you know a better way?
            print(item, end=' ')
    translate(english)

编辑以显示chepner的答案和chisaku的格式提示:

sweedish = {'merry': 'god', 'christmas': 'jul', 'and': 'och', 'happy':'nytt','year':'ar'}
english =('merry christmas and happy new year')
new = english.split()
print(' '.join([sweedish[item] for item in new if item in sweedish] ))

2 个答案:

答案 0 :(得分:1)

列表理解只是一次性建立一个列表,而不是单独调用append将项添加到for循环内的结尾。

place_holder = [ sweedish[item] for item in new if item in sweedish ]

变量本身是不必要的,因为您可以将列表推导直接放在for循环中:

for item in [ sweedish[item] for item in new if item in sweedish ]:

答案 1 :(得分:0)

正如@chepner所说,你可以使用列表理解来简明地构建从英语翻译成瑞典语的新单词列表。

要访问字典,您可能需要使用swedish.get(word,' null_value_placeholder'),因此如果您的英语单词不在,则不会出现KeyError。字典。

在我的例子中,'无'是字典中没有翻译的英语单词的占位符。你可以使用''作为占位符,承认字典中的差距仅提供近似翻译。

swedish = {'merry': 'god', 'christmas': 'jul', 'and': 'och', 'happy':'nytt','year':'ar'}
english ='merry christmas and happy new year'

def translate(s):
    words = s.split()
    translation = [swedish.get(word, 'None') for word in words] 
    print ' '.join(translation)

translate(english)

>>>
god jul och nytt None ar

或者,您可以在列表推导中添加条件表达式,以便列表推导仅尝试翻译显示在词典中的单词。

def translate(s):
    words = s.split()
    translation = [swedish[word] for word in words if word in swedish.keys()]
    print ' '.join(translation)

translate(english)

>>> 
god jul och nytt ar

' ' .join(翻译)功能会将您的单词列表转换为由'分隔的字符串。 '