2016-10-04 5 views
2

私は少し私がいる問題で混乱し、誰でも助けることができるのか疑問に思っています(ので、私はそれが本当にあることを願って、私の心の中で些細なようだ!)リストの内包表記の混乱

基本的に、私を濾過してきました以下のリストの内包表記を経由してリストによって:

depfilt = [s for s in department if 'author' not in s] 

(部門は154個の要素を持っていたし、得られdepfiltは72個の要素を有する場合)

今、私はまた、154個の要素(subjとID値のリストを個別に持っていました)、その指数このリストの一致するものはdepartmentです。私の心の中で

subfilt = [s for s in subj if 'author' not in department[subj.index(s)]] 

、私はこれが働いてきたはずですが、subfiltが実際にではなく、106個のリスト要素を返して感じる:フィルタリング処理は非常に次のコード行を使用した後、私は、正しいID値を保持したかったです72.

なぜ誰にも分かりませんか?

おかげ

答えて

7

利用enumerateの代わりに、重複した値

[s for i, s in enumerate(subj) if 'author' not in department[i]] 
+0

、ありがとう! –

0

の場合indexdepartmentsubjは同じ順序、すなわちに間違いなくある場合。

[(d, s) for d, s in zip(department, subject) if 'author' not in d] 

(被験者に対する部門のdsを使用):各々の対応する要素は、同時に両方のリストを反復処理するためにzipを使用し、その後、一致します。

このように、各要素をインデックスで参照する必要はありません。ちょうど標準的な反復。

編集:あなたが既に持っていると、両方をループしながら、まだ「著者に対してフィルタリング、そのような主題のための第二のループを変更すると、あなたがdeptための最初のステップを行うことができます別々のリストを維持したい場合:

[s for d, s in zip(department, subject) if 'author' not in d] 

(そうdの値は、第二のループでは無視されます)出力の

例:

これは私のために働いた
>>> department = ['something', 'else', 'author', 'okay'] 
>>> subject = ['some_subj', 'else_subj', 'author_subj', 'okay_subj'] 
>>> [(d, s) for d, s in zip(department, subject) if 'author' not in d] 
[('something', 'some_subj'), ('else', 'else_subj'), ('okay', 'okay_subj')] 
>>> 
>>> # and if you MUST do them seprately: 
... [s for s in department if 'author' not in s] # that's your `deepfilt` 
['something', 'else', 'okay'] 
>>> [s for d, s in zip(department, subject) if 'author' not in d] # this is for `subfilt` 
['some_subj', 'else_subj', 'okay_subj'] 
+0

リストの内容はどうなるでしょうか? –

+0

これの結果は、 'd'と' s'のタプルがペアになったリストを取得しています。 – aneroid

+0

私はこの方法の問題は、私がリストをさらにフィルタリングする必要があるということか、それとも比較的簡単なことですか? –

関連する問題