2016-07-14 6 views
-1
def divisble_numbers(a_list, terms): 
    b_list = [x for x in [a_list] if (x % [terms] == 0)] 
    c_list = [x for x in b_list if all(x % [terms] == 0)] 
    return c_list 

divisble_numbers([2,3,5,1,6,7,8,9,10,11,12], [2,3])   

戻り、このエラーの問題を持つ:TypeError: unsupported operand type(s) for %: 'int' and 'list'リスト内包して

私は両方の用語で割り切れるインデックスのリストを取得するために取得しようとしていますが。私は、私が得ているエラーに混乱しています。リストの理解には非常に新しいので、助けに感謝します。

+1

リストを持つ整数のmodはどうなるべきですか? 'x%[term]'があなたに与えるべきことは何ですか? –

答えて

2

あなたはかなり近くにいました。このコードは正常に動作するはずです:

def divisble_numbers(a_list, terms): 
    return [x for x in a_list if all(x % term == 0 for term in terms)] 

print(divisble_numbers([2,3,5,1,6,7,8,9,10,11,12], [2,3])) 

# Output: 
# [6, 12] 

ここでは2つのリスト内包があります。 1つはx for x in a_list if ...です。もう1つはallx % term == 0 for term in termsです。

+0

ありがとう、簡単な質問なぜ2番目のループが必要ですか?私はすべての機能がリストを反復するだろうが? – Landon

+0

'all'はイテレータを通り、その中のすべてが真であることを確認します。ですから、最初に、 'x'がその項で割り切れるときに' True'と言われるすべての項に対してイテレータを必要とします。 'x%term == 0という言葉で言えば、あなたにはこのようなことがあります。 – smarx

+0

ありがとうございました – Landon

0
b_list = [x for x in a_list if x%(reduce(lambda x,y : x*y, terms))==0] 

入力:

a_list, terms = [2,3,5,1,6,7,8,9,10,11,12], [2,3] 

出力:

[6, 12] 

あなたの関数は次のようになります。

def divisble_numbers(a_list, terms): return [x for x in a_list if x%(reduce(lambda x,y : x*y, terms))==0] 
+0

このコードは実際には間違っていると思います。例えば。 'a_list、terms = [4]、[2、4]'を試してください。 – smarx

2

あなたのリストの内包表記は良いですが、あなたは偶然包まれました大括弧で囲まれたものはほとんどありません[terms]のように、既にリストになっているためである必要はありません。 [terms]は、リストを含むリストを生成します。

第2に、取得したエラーは、リストのmod(%)を使用していたためです。 mod演算子は数値間でのみ動作します。

def divisble_numbers(a_list, terms): 
    b_list = [x for x in a_list if (x % terms[0] == 0)] 
    c_list = [x for x in b_list if (x % terms[1] == 0)] 
    return c_list 
+0

この関数は、リストの2番目の項で割り切れる数値のリストを返します。 (実際には 'b_list = ...'行を削除することもできます。その結果は完全に無視されるからです)。 – smarx