Python 3.x 如何将if、elif条件中包含多个语句的for循环转换为列表理解

Python 3.x 如何将if、elif条件中包含多个语句的for循环转换为列表理解,python-3.x,list-comprehension,Python 3.x,List Comprehension,我想把上面的for循环转换成list。我试过了 for i in range(len(q)): # q.remove(max(q)) # maxi = max(q) if((q.index(max(q)))+3) in range(len(q)): return("Too chaotic") if((q.index(max(q)))+2) in range(len(q)): bribe = bri

我想把上面的for循环转换成list。我试过了

for i in range(len(q)):
        # q.remove(max(q))
        # maxi = max(q)

    if((q.index(max(q)))+3) in range(len(q)):
            return("Too chaotic")

    if((q.index(max(q)))+2) in range(len(q)):
            bribe = bribe + 2
            q.remove(max(q))
    elif ((q.index(max(q)))+1) in range(len(q)):
            bribe = bribe + 1
            q.remove(max(q))
    elif(q.index(max(q))) == (len(q)-1):
            q.remove(max(q))
 return(bribe)

但是它不起作用。

有几十个这样的问题:如何将这段代码转换为列表/目录理解?我看到了三个主要目标:

  • 性能:希望提高代码的速度或减少内存占用
  • 表达性:一个人想要一个简洁明了的代码
  • 学习/乐趣/实验:一个人想要了解列表理解本身
但有时,我们根本不知道。这里就是这种情况,因此我将从一般的想法开始

以下是我创建列表前的经验法则,按重要性顺序排列:

  • 从一个干净的代码开始,因为列表理解不会使代码更干净(实际上可能恰恰相反)
  • 确保要创建列表或列表的聚合函数(总和、最大值等)
  • 确保代码的控制流不使用跳转(
    返回
    中断
    提升
    ,…)
  • 确保你没有任何副作用
  • 让我们试着用这些规则来解决你的问题

    清除代码 首先要修复的是返回值的类型。根据情况,可以返回字符串或整数。尽管Python没有强制执行函数来实现类型一致性,但您应该避免这种混淆。您可以返回特殊值(
    -1
    )或引发异常

    这里还有一些问题需要解决:

    • 从不使用
      i
      :将其替换为
      (请参阅)
    • 计算
      q.index(max(q))
      一次,并将其存储在变量
      max_q_index

    • x在范围内(len(q))
      表示
      0不。你让你未来的自我变得非常非常艰难。不需要将所有内容都转换为列表理解,当列表变得不可读时就不需要了。注意:
      如果
      elif
      不是函数,它们就不需要
      (…)
      。在这里,您确实过度使用了括号,使得在没有列表理解的情况下阅读代码中发生的事情变得非常困难。列表理解用于创建值列表。不要仅仅因为它们包含循环就使用它们。它们不是用于更换回路的通用衬里
      someinteger-in-range(len(q))
      也是一种很难解析的表达
      0的方式,请参阅以清理您发布的代码;但是,可以使用带有
      enumerate()
      的排序重新编写它。不管怎样,这都不适合列表比较。
      ["Too chaotic" if((q.index(max(q)))+3) in range(len(q)) 
       bribe+2,q.remove(max(q)) if((q.index(max(q)))+2) in range(len(q))  
       else [bribe+2,q.remove(max(q)]  if((q.index(max(q)))+2) in range(len(q)) 
       else q.remove(max(q)) if (q.inde  (max(q))) == (len(q)-1) for i in 
       range(len(q))]
      
      for _ in range(len(q)):
          m = max(q)
          max_q_index = q.index(m) # position of the max
          if max_q_index < len(q) - 3:
              return -1
      
          if max_q_index < len(q) - 2:
              bribe = bribe + 2
              q.remove(m)
          elif max_q_index < len(q) - 1:
              bribe = bribe + 1
              q.remove(m)
          elif max_q_index == len(q)-1:
              q.remove(m)
          # no else since max_index < len(q)
      
      for _ in range(len(q)):
          m = max(q)
          max_q_index = q.index(max(q)) # position of the max
          if max_index < len(q) - 3:
              return -1
      
          if max_index == len(q) - 3:
              bribe = bribe + 2
          elif max_index == len(q) - 2:
              bribe = bribe + 1
          q.remove(m)
      
      for _ in range(len(q)):
          m = max(q)
          max_q_index = q.index(m) # position of the max
          distance = len(q) - 1 - max_q_index
          if distance >= 3:
              return -1
      
          bribe += distance
          q.remove(m)
      
      >>> L = [1,2,4,3,7,5]
      >>> list(zip(L, range(len(L))))
      [(1, 0), (2, 1), (4, 2), (3, 3), (7, 4), (5, 5)]
      >>> S = sorted(zip(L, range(len(L))))
      >>> S
      [(1, 0), (2, 1), (3, 3), (4, 2), (5, 5), (7, 4)]
      
      >>> bribe = 0
      >>> for i, (_, pos) in enumerate(S):
      ...     distance = max(i - pos, 0)
      ...     if distance >= 3:
      ...         raise Exception() # can't return outside of a function.
      ...     bribe += distance
      ...
      >>> bribe
      2
      
      >>> L = [1,2,4,3,7,5]
      >>> sum(max(i - pos, 0) for i, (_, pos) in enumerate(sorted(zip(L, range(len(L))))))
      2
      >>> L = [1,2,7,3,4,5]
      >>> sum(max(i - pos, 0) for i, (_, pos) in enumerate(sorted(zip(L, range(len(L))))))
      3