2

次の構造のネストされたリストがあります。

nested = [["a","b"], ["c", "d"]]

この構造に固執したいのですが、要素が別のリストに属している場合は削除します。このリストがstoplist = ["a","z"]

したがって、結果は次のようになります。

[["b"], ["c", "d"]] 

ここで単純なことを見逃していることを願っていますが、この場合、リストの理解が得られないようです:

[letter for letter in List if letter not in stoplist for List in nested],

実行されますが、次の結果が返されます。['c', 'c', 'd', 'd']

何が起こっているのか、これを解決する方法は?

注:これは追加で実行できることは理解していますが、大きなファイルを扱うので、これは避けたいと思います。

4

3 に答える 3

5

多分何かのような

>>> nested = [["a","b"], ["c", "d"]]
>>> stoplist = ["a", "z"]
>>> [[letter for letter in sublist if letter not in stoplist] for sublist in nested]
[['b'], ['c', 'd']]

含まれているものstoplistがハッシュ可能であれば、それを にした方が速いかもしれませんset(ただし、非常に小さなコレクションの場合、推測するのは難しく、それが重要かどうかを判断するのは困難ですtimeit)。

>>> stopset = set(stoplist)
>>> [[letter for letter in sublist if letter not in stopset] for sublist in nested]
[['b'], ['c', 'd']]

現在のリストコンプは次のように展開できます

newlist = []
for letter in List:
    if letter not in stoplist:
        for List in nested:
            newlist.append(letter)

これは(そしてこれは数分間私を困惑させました)実際にはまったく機能しないはずです. 以前の実行からピックアップしている必要がありListます。

リスト内包表記でネストを記述する順序は、同等のネストされた for ループを記述する場合と同じであることに注意してください。

于 2013-10-17T20:59:02.340 に答える