【问题标题】:Multiple IF conditions in a python list comprehensionpython列表理解中的多个IF条件
【发布时间】:2012-05-03 14:43:08
【问题描述】:

我想知道,是否可以将多个 if 条件放在列表理解中?我在文档中没有找到类似的内容。

我希望能够做这样的事情

ar=[]
for i in range(1,n):
  if i%4 == 0: ar.append('four')
  elif i%6 == 0: ar.append('six')
  else: ar.append(i)

使用列表推导。我该怎么做?

这甚至可能吗?如果不是,那么最优雅(pythonic)的方法是什么?

【问题讨论】:

    标签: python conditional list-comprehension


    【解决方案1】:

    怎么样

    ar = [('four' if i % 4 == 0 else ('six' if i % 6 == 0 else i)) for i in range(1, n)]
    

    例如,如果n = 30 这是

    [1, 2, 3, 'four', 5, 'six', 7, 'four', 9, 10, 11, 'four', 13, 14, 15, 'four', 17, 'six', 19, 'four', 21, 22, 23, 'four', 25, 26, 27, 'four', 29]
    

    ETA:以下是应用条件列表的方法:

    CONDITIONS = [(lambda i: i % 4 == 0, "four"), (lambda i: i % 6 == 0, "six"),
                  (lambda i: i % 7 == 0, "seven")]
    
    def apply_conditions(i):
        for condition, replacement in CONDITIONS:
            if condition(i):
                return replacement
        return i
    
    ar = map(apply_conditions, range(0, n))
    

    【讨论】:

    • 谢谢!我相信这样我可以添加任意数量的条件。虽然代码会难以理解!
    • 查看我的编辑。我相信你能算出其余的(但如果不是我可以帮忙)
    • (我原来忽略了使它们成为 lambda 语句,但当前版本可以工作)
    • 好的,这是list 的条件,但我如何在列表理解中使用它们?此外,要将 i 放入列表中(当 i 不能被任何数字整除),代码应该知道何时没有 @987654326 中的任何条件@ 是真的。
    • 这只是元组解包 - 它也可以作为for c in conditions: if c[0](i): return c[1] 完成(解包版本更清晰)
    【解决方案2】:

    你可以把你的逻辑放在一个单独的函数中,然后拥有列表理解的优雅以及函数的可读性:

    def cond(i):
        if i % 4 == 0: return 'four'
        elif i % 6 == 0: return 'six'
        
        return i
    
    l=[cond(i) for i in range(1,n)]
    

    如果你有很多条件,通常维护一个单一的字典比维护一个大的 if/else 阶梯更容易:

    def cond(i):
        mkey={4:'four',6:'six'}
        return next((mkey[k] for k in mkey if i%k == 0), i)
    

    这使用默认版本的 next 来查找任何整数键是否是该键或数字本身的倍数,如果不是,则使用默认值。

    如果需要,这可能是一个单一的理解:

    [next((v for k,v in {4:'four',6:'six'}.items() if i%k==0), i) for i  in range(1,10)]
    

    【讨论】:

      【解决方案3】:
      ar = ["four" if i%4==0 else "six" if i%6==0  else i for i in range(1,30)]
      

      【讨论】:

        猜你喜欢
        • 2020-08-27
        • 2017-03-20
        • 2017-11-14
        • 2020-01-07
        • 1970-01-01
        • 2023-02-14
        • 1970-01-01
        • 2017-10-07
        • 1970-01-01
        相关资源
        最近更新 更多