为什么/如何结果=(x +' o' ... if ... else ... for ... in ...)有效吗?

时间:2018-03-31 19:40:23

标签: python

对于强盗的语言挑战事物Wikipedia我挣扎于我有限的知识并想出了这个:

def translate(txt):
    new_txt = ''
    consonants = 'bcdfghjklmnpqrstvwxz'
    for x in txt:
        if x in consonants:
            new_txt += x + 'o' + x
        else:
            new_txt += x
    return new_txt
print(translate("Hello World"))

我理解+ =运算符用于附加new_txt变量,而不是使用just =,这将导致只有" dod"的回答。在这个例子中,它取代了for循环的每个循环,当x == d时离开最后一次运行。 我找到了几个解决这个问题的简单方法,但是我对Python和编码的经验缺乏,我无法理解这些答案的几个方面。 例如:

def translate(txt):
    consonants = 'bcdfghjklmnpqrstvwxz'
    new_txt = (x + 'o' + x if x in consonants else x for x in txt)          
    return ''.join(new_txt)
print(translate("Hello World"))

由几个用户在几个线程中提供不同级别的相似性,但是我不明白这是怎么回事

new_txt = (x + 'o' + x if x in consonants else x for x in txt)
return ''.join(new_txt)

部分与我提出的不同。这是什么类型的组件,它如何在new_txt字符串上执行+ =并附加

的每个后续循环的结果
new_txt = (x + 'o' + x if x in consonants else x for x in txt) 

行?是什么赋予了该语句持久性的结果,即为什么它不能替换输入的txt字符串的每个循环和字符?这个概念叫什么?我已经在网上和StackOverflow中查看了,但这很难,因为我不知道我作为一个非常陌生的人正在寻找什么。我觉得这是一个非常基本的东西,我应该知道答案,以便尝试这样的事情,但是在这一点上,如果我不问我不会知道。 谢谢。

1 个答案:

答案 0 :(得分:0)

这类似于列表推导,它将是相同的,但使用[] -brackets。上面的代码作为列表理解将是:

new_txt = [x + 'o' + x if x in consonants else x for x in txt]
return ''.join(new_txt)

列表推导(和词典,集合理解)是一种替代循环的pythonic方法。因此,不是编写一个或多个循环,而是可以使用单行代码作为上面提到的列表理解。它还用于替换map(),reduce()和filter()等函数。可以使用for循环重写该示例:

new_txt = []
for x in txt:
    if x in consonants:
        new_text += x + 'o' + x
    else:
        new_text += x
return ''.join(new_text)

join方法将列表的每个元素与之前指定的分隔符连接起来,在本例中为空字符串,因此基本上没有分隔符。

列表推导的结构通常如下:

[x for x in iterable]

您也可以添加条件。这是通过您提供给我们的示例完成的。

有关详细信息,请查看DataCamp中的this great tutorial

希望它对你有所帮助。 此致。