2016-04-29 2 views
2

私はfoundallowedという2つのデータセットを持っています。 foundの観測値のいずれかがallowedに表示されていないかどうかを確認したいので、許可されていないとフラグを立てるようにしてください。リストの理解に欠けている値と書き込みループの比較

found = [["A", "B", "C"], [10, 20, 30], ["X", "Y", "Z"]] 
allowed = [["A", "B", "C", "D"], [20, 30, 40], ["W", "X", "Y"]] 

私は次のことを実行する場合、私は少数の行を必要と以下のように、実行して、私はより簡単だと思う場合は、それがnew_values = [(2, 'Z')]を返し[(1, 10), (2, 'Z')]

new_values = [] 
for x in range(0, len(allowed)): 
    for val in found[x]: 
     if val not in allowed[x]: 
      new_values.append((x, val)) 

で正しい答えを取得

for x in range(0, len(allowed)): 
    new_values = [(x, val) for val in found[x] if val not in allowed[x]] 

(1, 10)はどうなりましたか? 10 in allowed[1]を実行した場合、Falseと表示され、new_valuesに掲載されているはずです。

+0

複数の 'found'に非許可がある場合、どのようなデータ構造、あなたが期待しますか? – schwobaseggl

+0

上記のように、正解は '[(1,10)、(2、 'Z')]' –

答えて

3

あなたはループの中new_valuesを再割り当てされています

new_values = [] 
for x in range(0, len(allowed)): 
    new_values.extend([(x, val) for val in found[x] if val not in allowed[x]]) 

や、さらに短いリストの内包表記を使用して::

new_values = [(x, val) for x in range(0, len(allowed)) for val in found[x] if val not in allowed[x]] 
2
new_values = [(x, val) for x, allowable in enumerate(allowed) 
         for val in found[x] if val not in allowable] 

for x in range(0, len(allowed)): 
    new_values = [(x, val) for val in found[x] if val not in allowed[x]] 

はこれを試してみてください

一般的に考えられているさらにPythonのenumerateを使用して、値のインデックスが必要な場合は、シーケンスを反復処理します。

2

ネストされた理解にenumerateを挿入すると、それを短縮することができます。

new_values = [(i, x) for i, f in enumerate(found) for x in f if x not in allowed[i]] 
関連する問題