【问题标题】:Turning a for loop with multiple conditionals into a comprehension将具有多个条件的 for 循环转换为理解
【发布时间】:2020-10-20 04:04:18
【问题描述】:
def presses(phrase):
    i = 0
    for char in phrase.upper():
        if char in '1ADGJMPTW*#':
            i += 1
        if char.isspace() == True:
            i += 1
        if char in 'BEHKNQUX0':
            i += 2
        if char in 'CFILORVY':
            i += 3
        if char in '23456S8Z':
            i += 4
        if char in '79':
            i += 5
    return i    

我最近完成了一个 python 拼图,试图改进我的脚本;但是,我尝试将我的循环变成一个理解,但由于所有的条件,我很难做到这一点。谁能帮我试着把这个循环变成一个理解?

【问题讨论】:

  • 我认为this question 有一些有用的答案和一些有用的讨论来剖析答案。
  • 你为什么要把它变成一个理解结构?它们会产生各种容器或生成器,您只需计算事物并返回 int... 鉴于您正在做的事情的结构,它会像常规的 for 循环一样干净得多。
  • 列表推导用于创建列表。字典推导用于创建字典。你正在计算一个整数。没有 int 理解之类的东西。
  • @adamgy 没有可比性,条件表达式需要if-else,而不是各种ifs,至少,它在语义上不等价。

标签: python


【解决方案1】:

如果您的增量规则基于简单字符串,那么我将创建一个查找表并遍历您的输入字符串:

lookup = {
    '1': 1,
    'A': 1,
    ...
    '7': 5,
    '9': 5,
}

output = sum(lookup[char] for char in phrase)

【讨论】:

    【解决方案2】:

    要添加到@trianta2,如果您不想要查找字典(出于某种原因),您可以这样做:

    def presses_v2(phrase):
        return sum(1 if c in '1ADGJMPTW*# \t' else 2 if c in 'BEHKNQUX0' else 3 if c in 'CFILORVY' else 4 if c in '23456S8Z' else 5 if c in '79' else 0 for c in phrase.upper())
    

    请注意,您的第二个 if 语句可以包含在第一个中:

    if char in '1ADGJMPTW*# \t':
        i += 1
    

    我还将char 更改为c,以使行更短。

    【讨论】:

      【解决方案3】:

      我不明白您为什么要对此进行列表理解,因为您的代码现在更容易理解,但是.... p>

      i = [z for x, z in [('1ADGJMPTW*#', 1), (" ", 1), ('BEHKNQUX0', 2), ('CFILORVY', 3), ('23456S8Z', 4), ('79', 5)] for char in phrase.upper() if char in x]
      

      它基于这样的逻辑,即您拥有的每个 IF 都可以分为元组的两个部分,即条件和结果,知道您只需要构建一个元组列表并对其进行迭代。它为您提供了每个字符的值的列表。

      如果您想要总数,只需将其相加:

      i = sum([z for x, z in [('1ADGJMPTW*#', 1), (" ", 1), ('BEHKNQUX0', 2), ('CFILORVY', 3), ('23456S8Z', 4), ('79', 5)] for char in phrase.upper() if char in x])  
      

      【讨论】:

        猜你喜欢
        • 2020-04-15
        • 1970-01-01
        • 2023-01-29
        • 2020-03-29
        • 1970-01-01
        相关资源
        最近更新 更多