26

我想知道,是否可以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)方法是什么?

4

3 回答 3

44

怎么样

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))
于 2012-04-22T23:03:08.370 回答
15

您可以将逻辑放在单独的函数中,然后具有列表理解的优雅以及函数的可读性:

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)]

如果你有很多条件,通常更容易维护一个 dict 而不是一个大的 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)]
于 2012-04-26T07:07:01.233 回答
5
ar = ["four" if i%4==0 else "six" if i%6==0  else i for i in range(1,30)]
于 2019-04-19T16:13:50.583 回答