これはPython: split a list based on a condition?に非常に類似しており、またhttps://nedbatchelder.com/blog/201306/filter_a_list_into_two_parts.htmlではなく、述語に基づいて2つのリストに個々の要素を分割するのは、私は述語を失敗した最初の要素で二つの部分にリストを分割したいです。 (我々は条件を複数回評価する必要はありません一致する要素でリストを分割するPythonicで効率的な方法は何ですか?
入力リストがソートされない場合があり- 入力リストが含まれていてもよい重複要素理想的 :
>>> divide_list(lambda x: x < 7, list(range(10)))
([0, 1, 2, 3, 4, 5, 6], [7, 8, 9])
>>> divide_list(lambda x: x < 7, [1, 3, 5, 7, 9, 5])
([1, 3, 5], [7, 9, 5])
>>> divide_list(lambda x: x < 7, [7, 9, 5])
([], [7, 9, 5])
>>> divide_list(lambda x: x < 7, [1, 3, 5])
([1, 3, 5], [])
>>> divide_list(lambda x: x['a'], [{'a': True, 'b': 1}, {'a': True}, {'a': False}])
([{'a': True, 'b': 1}, {'a': True}], [{'a': False}])
物事
は注意します各要素について、値が重複しているならば、それは大丈夫です)
これはあまりにも複雑ですが、私は要素がリスト内に2回現れていることをあまり気にしません。それは、各要素に対して2回predをチェックしたくないということですfilter/filterfalseのさまざまなソリューションのような多くのことを行う。そして、set()は、リスト要素がハッシュ可能でない場合、これが機能しないことを意味しますか? – Tom
要素がハッシュ可能でない場合、要素をキャッシュするのではなく、重複する要素がないかどうかを確認します。高価な述語を持つ複製が多数存在する場合、効率的になるので、理想的にはセットを保持したいと考えています。 –
あなたが望むなら、私はハッシュ可能性をチェックし、そのフラグを使ってそのセットを使用するか使わないかのフラグを追加できます。 –