【问题标题】:Why/how does result = (x + 'o' ... if ... else ... for ... in ...) work?result = (x + 'o' ... if ... else ... for ... in ...) 为什么/如何工作?
【发布时间】:2018-03-31 19:40:22
【问题描述】:

对于强盗的语言挑战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 变量,而不是仅使用 =,这将导致此示例中的答案仅为“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 中查看过,但这很困难,因为我不知道作为一个对编码非常陌生的人我在寻找什么。我有一种感觉,这是非常基本的事情,我应该知道答案才能尝试这样的事情,但是在这一点上,如果我不问我不会知道。 谢谢。

【问题讨论】:

  • Explanation of how list comprehension works? -- 你拥有的是一个 genexp,但差异不是很相关。类似地:What does "list comprehension" mean? How does it work and how can I use it?——并解释这些解释与您在这里的内容有何关系,stackoverflow.com/questions/43943573
  • 括号中的表达式是“生成器表达式”。如果您用方括号替换括号,那将是“列表理解”。无论哪种方式,它都会生成一个可迭代的字符串序列(例如,“HoH”、“e”、“lol”……)。然后"".join() 表达式将所有这些组合成一个字符串(查找str.join 以获取更多详细信息)。
  • 在传递join时,最好使用列表推导,因为join需要构建一个列表。这样更快。
  • 感谢您的帮助和提供的资源/链接。我不知道 Python 中有这个有用的功能。

标签: python


【解决方案1】:

这看起来类似于列表推导式,两者相同,但使用 [] 括号。上面的代码作为列表理解将是:

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

列表推导(以及字典、集合推导)是一种替换循环的 Python 方式。因此,您可以使用单线作为上述列表推导,而不是编写一个或多个循环。它还用于替换 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

希望对您有所帮助。 真诚的。

【讨论】:

  • 感谢您的帮助。我投了赞成票,但我还没有得到展示的声誉!
猜你喜欢
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 2014-05-19
相关资源
最近更新 更多