2

リスト内包itertools表記または同様の関数を使用して、条件に基づいて 1 つのリストから 2 つの等しくないリストを作成することは可能ですか? 次に例を示します。

main_list = [6, 3, 4, 0, 9, 1]
part_list = [4, 5, 1, 2, 7]

in_main = []
out_main = []

for p in part_list:
    if p not in main_list:
        out_main.append(p)
    else:
        in_main.append(p)

>>> out_main
[5, 2, 7]

>>> in_main
[4, 1]

シンプルにしようとしていますが、使用例として、ディクショナリ キーを含むディクショナリmain_listの値を指定できpart_listます。両方のリストを同時に生成する必要があります。

4

5 に答える 5

6

繰り返しデータがない限り、順序は関係ありません。

main_set = set([6, 3, 4, 0, 9, 1])
part_set = set([4, 5, 1, 2, 7])

out_main = part_set - main_set
in_main = part_set & main_set

ジョブ完了。

于 2012-04-12T13:50:41.613 に答える
5

(part_list 内の) 順序が重要な場合:

out_main = [p for p in part_list if p not in main_list]
in_main = [p for p in part_list if p in main_list]

それ以外は:

out_main = list(set(part_list) - set(main_list))
in_main = list(set(part_list) & set(main_list))
于 2012-04-12T13:49:39.297 に答える
2

iterable で機能する trueitertoolsベースのソリューション:

>>> part_iter = iter(part_list)
>>> part_in, part_out = itertools.tee(part_iter)
>>> in_main = (p for p in part_in if p in main_list)
>>> out_main = (p for p in part_out if p not in main_list)

これらからリストを作成すると、イテレータを使用する意味がなくなりますが、結果は次のようになります。

>>> list(in_main)
[4, 1]
>>> list(out_main)
[5, 2, 7]

in_mainこれには、遅延生成およびout_main別の遅延生成シーケンスからの利点があります。唯一の問題は、一方を他方の前に反復する場合tee、他の反復子によって使用されるまで一連のデータをキャッシュする必要があることです。したがって、これは、両方をほぼ同時に反復処理する場合にのみ役立ちます。それ以外の場合は、補助記憶域を自分で使用することもできます。

興味深い三項演算子ベースのソリューションもあります。(これをリスト内包表記にすることもできますが、それは間違いです。) main_list を O(1) 検索用のセットに変更しました。

>>> main_set = set(main_list)
>>> in_main = []
>>> out_main = []
>>> for p in part_list:
...     (in_main if p in main_set else out_main).append(p)
... 
>>> in_main
[4, 1]
>>> out_main
[5, 2, 7]

collections.defaultdict楽しいアプローチもあります:

>>> import collections
>>> in_out = collections.defaultdict(list)
>>> for p in part_list:
...     in_out[p in main_list].append(p)
... 
>>> in_out
defaultdict(<type 'list'>, {False: [5, 2, 7], True: [4, 1]})
于 2012-04-12T14:24:50.970 に答える
0
in_main = list(set(main_list) & set(part_list))
out_main = list(set(part_list) - set(in_main))
于 2012-04-12T14:10:54.540 に答える