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

多くの条件がある場合は、通常、大きな if/else はしごよりも、単一の dict を維持する方が簡単です。

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 に答える