1

以下のようなことをしたいです。リスト内包表記で条件式の出力が欲しい。リスト内包表記で可能ですか?

def why_bad(myvalue): #returns a list of reasons or an empty list it is good
   ...
   return [ reason1, reason2 ..]

bad_values = [ (myvalue,reasons) for myvalue in all_values if (reasons = why_bad(myvalue)) ]
4

3 に答える 3

1

次のようなリスト内包表記を作成できます。これは、値とその理由 (または空のリスト) を返し、それが悪い理由を示します。

def why_bad(value):
    reasons = []
    if value % 2:
        reasons.append('not divisible by two')
    return reasons

all_values = [1,2,3]

bad_values = [(i, why_bad(i)) for i in all_values]
print bad_values

例を拡張するために、値が不適切である理由についての条件チェックごとに elif を追加し、それをリストに追加することができます。

戻り値:

[(1, ['not divisible by two']), (2, []), (3, ['not divisible by two'])]

ただし、 all_values に一意の値しかない場合は、リスト内包表記ではなく辞書を作成することを検討してください。

>>> bad_values = dict([(i, why_bad(i)) for i in all_values])
>>> print bad_values
{1: ['not divisible by two'], 2: [], 3: ['not divisible by two']}
于 2012-07-12T15:01:15.533 に答える
0

ネストされたリスト内包表記を使用できます。

bad_values = [value_tuple for value_tuple in 
                  [(myvalue, why_bad(myvalue)) for myvalue in all_values]
              if value_tuple[1]] # value_tuple[1] == why_bad(myvalue)

または使用filter

bad_values = filter(lambda value_tuple: value_tuple[1],
                    [(myvalue, why_bad(myvalue)) for myvalue in all_values])
于 2012-07-12T14:57:52.427 に答える
0

きれいではありませんが、ネストしたリスト内包表記を試すことができます:

bad_values = [(v, reasons) for v in all_values 
                           for reasons in [why_bad(v)] if reasons]
于 2012-07-12T15:02:01.570 に答える